image-to-pixel 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,82 +1,82 @@
1
- /*! image-to-pixel v3.1.0 | MIT | https://github.com/Tezumie/Image-to-Pixel */
2
- var Gi=Object.defineProperty;var xt=(e,t)=>()=>(e&&(t=e(e=0)),t);var ji=(e,t)=>{for(var n in t)Gi(e,n,{get:t[n],enumerable:!0})};function wt(e){if(Array.isArray(e))return[e[0]|0,e[1]|0,e[2]|0];let t=String(e).trim().replace(/^#|^0x/i,"");if((t.length===3||t.length===4)&&(t=t.slice(0,3).split("").map(n=>n+n).join("")),!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(t))throw new Error(`Invalid colour "${e}"`);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function wn(e){try{return wt(e),!0}catch{return!1}}function Nt(e){return"#"+e.slice(0,3).map(t=>Math.max(0,Math.min(255,Math.round(t))).toString(16).padStart(2,"0")).join("")}function Zn(e,t,n){e=Kn(e),t=Kn(t),n=Kn(n);let o=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),i=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),r=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*o+.793617785*i-.0040720468*r,1.9779984951*o-2.428592205*i+.4505937099*r,.0259040371*o+.7827717662*i-.808675766*r]}function zo(e){if(e.length<2)return 1;let t=0;for(let n=0;n<e.length;n++){let o=1/0;for(let i=0;i<e.length;i++){if(n===i)continue;let r=e[n][0]-e[i][0],a=e[n][1]-e[i][1],c=e[n][2]-e[i][2],u=Math.sqrt(r*r+a*a+c*c);u<o&&(o=u)}t+=o}return Math.max(.04,Math.min(1,t/e.length/255))}var Xe,Kn,vn,vt=xt(()=>{Xe=e=>Nt(wt(e)),Kn=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);vn=[.2126,.7152,.0722]});function Rt(e,t=1,n={}){t=Math.max(1,Math.round(t));let o=e.width*t,i=e.height*t,r=new Uint8ClampedArray(o*i*4),a=e.data,c=e.width;for(let u=0;u<i;u++){let s=u/t|0;for(let l=0;l<o;l++){let p=(s*c+(l/t|0))*4,f=(u*o+l)*4;r[f]=a[p],r[f+1]=a[p+1],r[f+2]=a[p+2],r[f+3]=a[p+3]}}if(n.grid&&t>=3){let[u,s,l]=wt(n.gridColor||"#000000"),p=n.gridAlpha??.35;for(let f=0;f<i;f++)for(let h=0;h<o;h++){if(h%t&&f%t)continue;let y=(f*o+h)*4,E=r[y+3]/255,v=p+E*(1-p);r[y]=(u*p+r[y]*E*(1-p))/v,r[y+1]=(s*p+r[y+1]*E*(1-p))/v,r[y+2]=(l*p+r[y+2]*E*(1-p))/v,r[y+3]=v*255}}return{width:o,height:i,data:r}}function Vr(e,t,n){t=Math.max(1,Math.round(t)),n=Math.max(1,Math.round(n));let o=new Uint8ClampedArray(t*n*4),i=new Int32Array(t);for(let r=0;r<t;r++)i[r]=Math.min(e.width-1,Math.floor((r+.5)*e.width/t));for(let r=0;r<n;r++){let a=Math.min(e.height-1,Math.floor((r+.5)*e.height/n));for(let c=0;c<t;c++){let u=(a*e.width+i[c])*4,s=(r*t+c)*4;o[s]=e.data[u],o[s+1]=e.data[u+1],o[s+2]=e.data[u+2],o[s+3]=e.data[u+3]}}return{width:t,height:n,data:o}}function Xr(e,t=1/0){let n=new Set,o=e.data;for(let i=0;i<o.length&&!(o[i+3]!==0&&(n.add(o[i]<<16|o[i+1]<<8|o[i+2]),n.size>t));i+=4);return[...n].map(i=>Nt([i>>16,i>>8&255,i&255]))}function Wr(e,t=8){let{width:n,height:o,data:i}=e,r=(l,p)=>Math.abs(i[l]-i[p])<=t&&Math.abs(i[l+1]-i[p+1])<=t&&Math.abs(i[l+2]-i[p+2])<=t&&Math.abs(i[l+3]-i[p+3])<=t,a=(l,p)=>p?a(p,l%p):l,c=0,u=Math.max(1,Math.floor(o/64)),s=Math.max(1,Math.floor(n/64));for(let l=0;l<o;l+=u){let p=1;for(let f=1;f<n;f++)if(r((l*n+f)*4,(l*n+f-1)*4))p++;else if(c=a(c,p),p=1,c===1)return 1}for(let l=0;l<n;l+=s){let p=1;for(let f=1;f<o;f++)if(r((f*n+l)*4,((f-1)*n+l)*4))p++;else if(c=a(c,p),p=1,c===1)return 1}return c||1}var Vt=xt(()=>{vt()});function As(e){let t=e.split(/\r?\n/);if(!/^GIMP Palette/i.test(t[0]||""))throw new Error('Not a GIMP palette (missing "GIMP Palette" header)');let n="",o=[];for(let i of t.slice(1)){let r=i.trim();if(!r||r.startsWith("#"))continue;let a=/^Name:\s*(.*)$/i.exec(r);if(a){n=a[1].trim();continue}if(/^Columns:/i.test(r))continue;let c=/^(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})/.exec(r);c&&o.push(Xe([+c[1],+c[2],+c[3]]))}return{name:n,colors:o}}function Kr(e){let t=[];for(let n of e.split(/\r?\n/)){let o=n.trim();if(!o||o.startsWith(";")||o.startsWith("//"))continue;let i=/^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\b/i.exec(o);if(!i)continue;let r=i[1].length===8?i[1].slice(2):i[1];t.push(Xe(r))}return{name:"",colors:t}}function _s(e){let t=e.split(/\r?\n/).map(i=>i.trim());if(t[0]!=="JASC-PAL")throw new Error("Not a JASC palette");let n=parseInt(t[2],10)||0,o=[];for(let i=3;i<3+n&&i<t.length;i++){let r=/^(\d+)\s+(\d+)\s+(\d+)/.exec(t[i]);r&&o.push(Xe([+r[1],+r[2],+r[3]]))}return{name:"",colors:o}}function mo(e){let t=typeof e=="string"?JSON.parse(e):e,o=(Array.isArray(t)?t:t.colors||t.palette||[]).map(i=>typeof i=="object"&&i?i.hex||i.color:i).filter(Boolean).map(Xe);return{name:!Array.isArray(t)&&t.name||"",colors:o}}function Ps(e){let t=[],n=/#?\b([0-9a-f]{6})\b/gi,o;for(;o=n.exec(e);)t.push(Xe(o[1]));return{name:"",colors:t}}function go(e,t=""){let n=(/\.([a-z0-9]+)$/i.exec(t)||[])[1]?.toLowerCase()||"",i=String(e).replace(/^/,"").trim(),r;if(n==="gpl"||/^GIMP Palette/i.test(i)?r=As(i):n==="pal"||i.startsWith("JASC-PAL")?r=_s(i):n==="json"||i.startsWith("{")||i.startsWith("[")?r=mo(i):n==="hex"||n==="txt"?r=Kr(i):(r=Kr(i),r.colors.length||(r=Ps(i))),r.colors=Ts(r.colors).slice(0,256),!r.name&&t&&(r.name=t.replace(/\.[^.]+$/,"").replace(/[-_]+/g," ")),!r.colors.length)throw new Error("No colours found in that palette");return r}function Zr(e,t){let n=t.map(o=>{let i=Xe(o),r=parseInt(i.slice(1,3),16),a=parseInt(i.slice(3,5),16),c=parseInt(i.slice(5,7),16);return`${String(r).padStart(3)} ${String(a).padStart(3)} ${String(c).padStart(3)} ${i.slice(1)}`});return`GIMP Palette
1
+ /*! image-to-pixel v3.2.0 | MIT | https://github.com/Tezumie/Image-to-Pixel */
2
+ var sa=Object.defineProperty;var Ut=(e,t)=>()=>(e&&(t=e(e=0)),t);var ca=(e,t)=>{for(var n in t)sa(e,n,{get:t[n],enumerable:!0})};function Ft(e){if(Array.isArray(e))return[e[0]|0,e[1]|0,e[2]|0];let t=String(e).trim().replace(/^#|^0x/i,"");if((t.length===3||t.length===4)&&(t=t.slice(0,3).split("").map(n=>n+n).join("")),!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(t))throw new Error(`Invalid colour "${e}"`);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function An(e){try{return Ft(e),!0}catch{return!1}}function qt(e){return"#"+e.slice(0,3).map(t=>Math.max(0,Math.min(255,Math.round(t))).toString(16).padStart(2,"0")).join("")}function so(e,t,n){e=ao(e),t=ao(t),n=ao(n);let o=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),i=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),r=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*o+.793617785*i-.0040720468*r,1.9779984951*o-2.428592205*i+.4505937099*r,.0259040371*o+.7827717662*i-.808675766*r]}function Qo(e){if(e.length<2)return 1;let t=0;for(let n=0;n<e.length;n++){let o=1/0;for(let i=0;i<e.length;i++){if(n===i)continue;let r=e[n][0]-e[i][0],a=e[n][1]-e[i][1],c=e[n][2]-e[i][2],l=Math.sqrt(r*r+a*a+c*c);l<o&&(o=l)}t+=o}return Math.max(.04,Math.min(1,t/e.length/255))}var wt,ao,_n,Ot=Ut(()=>{wt=e=>qt(Ft(e)),ao=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);_n=[.2126,.7152,.0722]});function jt(e,t=1,n={}){t=Math.max(1,Math.round(t));let o=e.width*t,i=e.height*t,r=new Uint8ClampedArray(o*i*4),a=e.data,c=e.width;for(let l=0;l<i;l++){let s=l/t|0;for(let d=0;d<o;d++){let h=(s*c+(d/t|0))*4,f=(l*o+d)*4;r[f]=a[h],r[f+1]=a[h+1],r[f+2]=a[h+2],r[f+3]=a[h+3]}}if(n.grid&&t>=3){let[l,s,d]=Ft(n.gridColor||"#000000"),h=n.gridAlpha??.35;for(let f=0;f<i;f++)for(let p=0;p<o;p++){if(p%t&&f%t)continue;let b=(f*o+p)*4,M=r[b+3]/255,v=h+M*(1-h);r[b]=(l*h+r[b]*M*(1-h))/v,r[b+1]=(s*h+r[b+1]*M*(1-h))/v,r[b+2]=(d*h+r[b+2]*M*(1-h))/v,r[b+3]=v*255}}return{width:o,height:i,data:r}}function ii(e,t,n){t=Math.max(1,Math.round(t)),n=Math.max(1,Math.round(n));let o=new Uint8ClampedArray(t*n*4),i=new Int32Array(t);for(let r=0;r<t;r++)i[r]=Math.min(e.width-1,Math.floor((r+.5)*e.width/t));for(let r=0;r<n;r++){let a=Math.min(e.height-1,Math.floor((r+.5)*e.height/n));for(let c=0;c<t;c++){let l=(a*e.width+i[c])*4,s=(r*t+c)*4;o[s]=e.data[l],o[s+1]=e.data[l+1],o[s+2]=e.data[l+2],o[s+3]=e.data[l+3]}}return{width:t,height:n,data:o}}function ai(e,t=1/0){let n=new Set,o=e.data;for(let i=0;i<o.length&&!(o[i+3]!==0&&(n.add(o[i]<<16|o[i+1]<<8|o[i+2]),n.size>t));i+=4);return[...n].map(i=>qt([i>>16,i>>8&255,i&255]))}function si(e,t=8){let{width:n,height:o,data:i}=e,r=(d,h)=>Math.abs(i[d]-i[h])<=t&&Math.abs(i[d+1]-i[h+1])<=t&&Math.abs(i[d+2]-i[h+2])<=t&&Math.abs(i[d+3]-i[h+3])<=t,a=(d,h)=>h?a(h,d%h):d,c=0,l=Math.max(1,Math.floor(o/64)),s=Math.max(1,Math.floor(n/64));for(let d=0;d<o;d+=l){let h=1;for(let f=1;f<n;f++)if(r((d*n+f)*4,(d*n+f-1)*4))h++;else if(c=a(c,h),h=1,c===1)return 1}for(let d=0;d<n;d+=s){let h=1;for(let f=1;f<o;f++)if(r((f*n+d)*4,((f-1)*n+d)*4))h++;else if(c=a(c,h),h=1,c===1)return 1}return c||1}var Jt=Ut(()=>{Ot()});function Ws(e){let t=e.split(/\r?\n/);if(!/^GIMP Palette/i.test(t[0]||""))throw new Error('Not a GIMP palette (missing "GIMP Palette" header)');let n="",o=[];for(let i of t.slice(1)){let r=i.trim();if(!r||r.startsWith("#"))continue;let a=/^Name:\s*(.*)$/i.exec(r);if(a){n=a[1].trim();continue}if(/^Columns:/i.test(r))continue;let c=/^(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})/.exec(r);c&&o.push(wt([+c[1],+c[2],+c[3]]))}return{name:n,colors:o}}function ui(e){let t=[];for(let n of e.split(/\r?\n/)){let o=n.trim();if(!o||o.startsWith(";")||o.startsWith("//"))continue;let i=/^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\b/i.exec(o);if(!i)continue;let r=i[1].length===8?i[1].slice(2):i[1];t.push(wt(r))}return{name:"",colors:t}}function qs(e){let t=e.split(/\r?\n/).map(i=>i.trim());if(t[0]!=="JASC-PAL")throw new Error("Not a JASC palette");let n=parseInt(t[2],10)||0,o=[];for(let i=3;i<3+n&&i<t.length;i++){let r=/^(\d+)\s+(\d+)\s+(\d+)/.exec(t[i]);r&&o.push(wt([+r[1],+r[2],+r[3]]))}return{name:"",colors:o}}function So(e){let t=typeof e=="string"?JSON.parse(e):e,o=(Array.isArray(t)?t:t.colors||t.palette||[]).map(i=>typeof i=="object"&&i?i.hex||i.color:i).filter(Boolean).map(wt);return{name:!Array.isArray(t)&&t.name||"",colors:o}}function Ys(e){let t=[],n=/#?\b([0-9a-f]{6})\b/gi,o;for(;o=n.exec(e);)t.push(wt(o[1]));return{name:"",colors:t}}function Co(e,t=""){let n=(/\.([a-z0-9]+)$/i.exec(t)||[])[1]?.toLowerCase()||"",i=String(e).replace(/^/,"").trim(),r;if(n==="gpl"||/^GIMP Palette/i.test(i)?r=Ws(i):n==="pal"||i.startsWith("JASC-PAL")?r=qs(i):n==="json"||i.startsWith("{")||i.startsWith("[")?r=So(i):n==="hex"||n==="txt"?r=ui(i):(r=ui(i),r.colors.length||(r=Ys(i))),r.colors=Xs(r.colors).slice(0,256),!r.name&&t&&(r.name=t.replace(/\.[^.]+$/,"").replace(/[-_]+/g," ")),!r.colors.length)throw new Error("No colours found in that palette");return r}function di(e,t){let n=t.map(o=>{let i=wt(o),r=parseInt(i.slice(1,3),16),a=parseInt(i.slice(3,5),16),c=parseInt(i.slice(5,7),16);return`${String(r).padStart(3)} ${String(a).padStart(3)} ${String(c).padStart(3)} ${i.slice(1)}`});return`GIMP Palette
3
3
  Name: ${e||"Palette"}
4
4
  Columns: 8
5
5
  #
6
6
  ${n.join(`
7
7
  `)}
8
- `}var Ts,Jr,Qr,bo=xt(()=>{vt();Ts=e=>[...new Set(e)];Jr=e=>e.map(t=>Xe(t).slice(1)).join(`
8
+ `}var Xs,fi,pi,To=Ut(()=>{Ot();Xs=e=>[...new Set(e)];fi=e=>e.map(t=>wt(t).slice(1)).join(`
9
9
  `)+`
10
- `,Qr=(e,t)=>JSON.stringify({name:e||"Palette",colors:t.map(n=>Xe(n).slice(1))},null,2)});function Ls(e){let t=String(e||"").trim(),n=/palette-list\/([a-z0-9-]+)/i.exec(t);return(n?n[1]:t).toLowerCase().replace(/\.(json|hex|gpl)$/,"")}async function ei(e,{fetch:t=globalThis.fetch}={}){let n=Ls(e);if(!/^[a-z0-9-]+$/.test(n))throw new Error("That does not look like a Lospec palette slug");let o=await t(`https://lospec.com/palette-list/${n}.json`);if(!o.ok)throw new Error(`Lospec returned ${o.status} for "${n}"`);let i=await o.json(),r=mo(i);return{name:i.name||n,author:i.author||"",colors:r.colors,slug:n}}var ti=xt(()=>{bo()});function oi(e){let t=e.error?e.error.code:0,n=new Error(Us[t]||"the video could not be loaded");return n.code=t,e.error&&e.error.message&&(n.detail=e.error.message),n}async function nn(e,{timeout:t=6e4}={}){if(e.error)throw oi(e);return e.readyState<1&&await ni(e,"loadedmetadata",t),e.readyState<2&&await ni(e,"loadeddata",t).catch(n=>{if(n.code)throw n}),e}async function ri(e){let t=new Uint8Array(await e.arrayBuffer()),n={avc1:"H.264",avc3:"H.264",hvc1:"H.265 (HEVC)",hev1:"H.265 (HEVC)",av01:"AV1",vp09:"VP9",vp08:"VP8",mp4v:"MPEG-4 Part 2",apcn:"ProRes",apch:"ProRes",apcs:"ProRes",apco:"ProRes",ap4h:"ProRes 4444",dvh1:"Dolby Vision",dvhe:"Dolby Vision"};for(let r=0;r+24<t.length;r++)if(t[r]===115&&t[r+1]===116&&t[r+2]===115&&t[r+3]===100){let a=String.fromCharCode(t[r+16],t[r+17],t[r+18],t[r+19]);if(n[a])return n[a]}let o=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.length,1<<20))),i=/V_(VP8|VP9|AV1|MPEG4\/ISO\/AVC|MPEGH\/ISO\/HEVC)/.exec(o);return i?{VP8:"VP8",VP9:"VP9",AV1:"AV1","MPEG4/ISO/AVC":"H.264","MPEGH/ISO/HEVC":"H.265 (HEVC)"}[i[1]]:""}async function ii(e){try{let t=new Uint8Array(await e.slice(0,12).arrayBuffer());if(t[0]===26&&t[1]===69&&t[2]===223&&t[3]===163){let n=new TextDecoder("latin1").decode(await e.slice(0,4194304).arrayBuffer());return/A_(OPUS|VORBIS|AAC|MPEG|AC3|EAC3|FLAC|PCM|DTS|TRUEHD|ALAC)/.test(n)}for(let n=0;n+8<=e.size;){let o=new DataView(await e.slice(n,n+16).arrayBuffer()),i=o.getUint32(0),r=String.fromCharCode(o.getUint8(4),o.getUint8(5),o.getUint8(6),o.getUint8(7));if(i===1?i=Number(o.getBigUint64(8)):i===0&&(i=e.size-n),i<8)return null;if(r==="moov"){let a=new Uint8Array(await e.slice(n,n+i).arrayBuffer());for(let c=4;c+16<=a.length;c++)if(a[c]===104&&a[c+1]===100&&a[c+2]===108&&a[c+3]===114&&a[c+12]===115&&a[c+13]===111&&a[c+14]===117&&a[c+15]===110)return!0;return!1}n+=i}return null}catch{return null}}async function Xt(e,t){if(t=Math.max(0,Math.min(t,(e.duration||0)-1e-4)),Math.abs(e.currentTime-t)<1e-6&&e.readyState>=2)return;let n="requestVideoFrameCallback"in e?new Promise(i=>{e.requestVideoFrameCallback(()=>i()),setTimeout(i,500)}):null,o=Rs(e,"seeked");e.currentTime=t,await o,n&&await n}async function On(e,t=30){if(!("requestVideoFrameCallback"in e))return t;await nn(e);let n={t:e.currentTime,muted:e.muted,paused:e.paused},o=[];try{e.muted=!0,await new Promise(a=>{let c=setTimeout(a,1200),u=(s,l)=>{o.push(l.mediaTime),o.length>=12?(clearTimeout(c),a()):e.requestVideoFrameCallback(u)};e.requestVideoFrameCallback(u),e.play().catch(()=>{clearTimeout(c),a()})})}finally{e.pause(),e.muted=n.muted,await Xt(e,n.t).catch(()=>{})}let i=[];for(let a=1;a<o.length;a++){let c=o[a]-o[a-1];c>.001&&i.push(c)}if(i.length<3)return t;i.sort((a,c)=>a-c);let r=1/i[Math.floor(i.length/2)];for(let a of[12,15,23.976,24,25,29.97,30,48,50,59.94,60])if(Math.abs(r-a)<.6)return a;return Math.round(r)}function yo({duration:e,fps:t,start:n=0,end:o=e,maxFrames:i=1/0}){let r=[],a=Math.min(i,Math.max(1,Math.floor((o-n)*t+1e-6)));for(let c=0;c<a;c++)r.push(n+(c+.5)/t);return r}async function Dn(e,t){await nn(e);let n=e.paused;e.pause();let o=yo({duration:e.duration,...t});for(let i=0;i<o.length;i++){if(t.signal&&t.signal.aborted)throw new DOMException("Aborted","AbortError");await Xt(e,o[i]),await t.onFrame({index:i,time:o[i],total:o.length})}return n||e.play().catch(()=>{}),o.length}var Rs,Us,ni,Fn=xt(()=>{Rs=(e,t,n=4e3)=>new Promise((o,i)=>{let r=setTimeout(()=>{e.removeEventListener(t,a),i(new Error(`Timed out waiting for "${t}"`))},n),a=()=>{clearTimeout(r),o()};e.addEventListener(t,a,{once:!0})}),Us={1:"loading was aborted",2:"a network error stopped the download",3:"the browser could not decode it",4:"this browser can't play this video's format"};ni=(e,t,n)=>new Promise((o,i)=>{let r=()=>{clearTimeout(u),e.removeEventListener(t,a),e.removeEventListener("error",c)},a=()=>{r(),o()},c=()=>{r(),i(oi(e))},u=setTimeout(()=>{r(),i(new Error(`no response from the video decoder after ${n/1e3} s`))},n);e.addEventListener(t,a,{once:!0}),e.addEventListener("error",c,{once:!0})})});async function Ns(e){if(e instanceof ArrayBuffer)return e.slice(0);if(ArrayBuffer.isView(e))return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);if(typeof Blob<"u"&&e instanceof Blob)return e.arrayBuffer();let t=typeof e=="string"?e:e&&(e.currentSrc||e.src);if(!t)throw new TypeError("decodeAudio() takes a File, Blob, ArrayBuffer, URL or <video>/<audio> element");let n=await fetch(t);if(!n.ok)throw new Error(`Couldn't load the audio: ${n.status} ${n.statusText}`);return n.arrayBuffer()}async function bi(e,t={}){if(typeof OfflineAudioContext>"u")return null;let n=t.sampleRate||Mo,o=await Ns(e),i;try{i=await new OfflineAudioContext(1,1,n).decodeAudioData(o)}catch{return null}let r=Math.max(0,t.start||0),a=Math.min(i.duration,t.end>r?t.end:i.duration),c=Math.floor((a-r)*n);if(c<1)return null;let u=Math.min(t.channels||2,i.numberOfChannels),s=new OfflineAudioContext(u,c,n),l=s.createBufferSource();l.buffer=i,l.connect(s.destination),l.start(0,r,c/n);let p=await s.startRendering(),f=[];for(let h=0;h<u;h++)f.push(p.getChannelData(h));return{sampleRate:n,numberOfChannels:u,channels:f,duration:c/n}}async function zn(e,t=Mo,n=2,o=128e3){if(typeof AudioEncoder>"u"||!ko[e])return null;let i=e==="opus"?[48e3]:[...new Set([t,48e3,44100])],r=[...new Set([o,128e3,192e3,16e4,96e3,0])];for(let a of i)for(let c of r){let u={codec:ko[e],sampleRate:a,numberOfChannels:n,...c?{bitrate:c}:{},...e==="aac"?{aac:{format:"aac"}}:{}};if((await AudioEncoder.isConfigSupported(u).catch(()=>({}))).supported)return u}return null}async function Bn(e,t=Mo,n=2){return!!await zn(e,t,n)}async function Gs(e,t){if(e.sampleRate===t)return e;let{numberOfChannels:n,channels:o}=e,i=Math.max(1,Math.round(o[0].length*t/e.sampleRate)),r=new OfflineAudioContext(n,i,t),a=r.createBuffer(n,o[0].length,e.sampleRate);for(let l=0;l<n;l++)a.copyToChannel(o[l],l);let c=r.createBufferSource();c.buffer=a,c.connect(r.destination),c.start();let u=await r.startRendering(),s=[];for(let l=0;l<n;l++)s.push(u.getChannelData(l));return{sampleRate:t,numberOfChannels:n,channels:s,duration:i/t}}async function Co(e,t){if(typeof AudioEncoder>"u")throw new Error("This browser has no WebCodecs AudioEncoder");let n=t.config||{codec:ko[t.codec],sampleRate:e.sampleRate,numberOfChannels:e.numberOfChannels,bitrate:t.bitrate||128e3,...t.codec==="aac"?{aac:{format:"aac"}}:{}};n.sampleRate!==e.sampleRate&&(e=await Gs(e,n.sampleRate));let{sampleRate:o,numberOfChannels:i,channels:r}=e,a=null,c=new AudioEncoder({output:(p,f)=>t.onChunk(p,f),error:p=>{a=p}});c.configure(n);let u=Number.isFinite(t.maxDuration)?Math.floor(t.maxDuration*o):1/0,s=Math.min(r[0].length,u),l=Math.round(o/10);for(let p=0;p<s&&!a;p+=l){let f=Math.min(l,s-p),h=new Float32Array(f*i);for(let E=0;E<i;E++)h.set(r[E].subarray(p,p+f),E*f);let y=new AudioData({format:"f32-planar",sampleRate:o,numberOfFrames:f,numberOfChannels:i,timestamp:Math.round(p*1e6/o),data:h});c.encode(y),y.close(),c.encodeQueueSize>16&&await new Promise(E=>setTimeout(E,0))}if(a||await c.flush().catch(p=>{a=p}),c.state!=="closed"&&c.close(),a)throw a}function yi(e,t,n=312){let o=new Uint8Array(19);o.set([79,112,117,115,72,101,97,100]);let i=new DataView(o.buffer);return i.setUint8(8,1),i.setUint8(9,e),i.setUint16(10,n,!0),i.setUint32(12,t,!0),i.setInt16(16,0,!0),i.setUint8(18,0),o}function gn(e){if(!e||e.length<19||String.fromCharCode(...e.subarray(0,8))!=="OpusHead")return null;let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{channels:t.getUint8(9),preSkip:t.getUint16(10,!0),sampleRate:t.getUint32(12,!0)}}var ko,Mo,Nn=xt(()=>{ko={aac:"mp4a.40.2",opus:"opus"},Mo=48e3});function Te(e,t){let n=new jn;t(n);let o=n.out(),i=new jn().u32(o.length+8).str(e).out(),r=new Uint8Array(o.length+8);return r.set(i),r.set(o,8),r}function js(e,t){let n=Gn(5,[...e]),o=Gn(4,[64,21,0,0,0,...wi(t),...wi(t),...n]),i=Gn(6,[2]);return Ee("esds",0,0,r=>r.bytes(Gn(3,[0,2,0,...o,...i])))}function Vs(e){if(!e||e.length<7||e[0]!==1)return!1;let t=5,n=e[t++]&31;if(!n)return!1;for(let i=0;i<n;i++){if(t+2>e.length)return!1;let r=e[t]<<8|e[t+1];if(t+=2,r<4||t+r>e.length)return!1;let a=e.subarray(t,t+r);if((a[0]&31)!==7||i===0&&(a[1]!==e[1]||a[2]!==e[2]||a[3]!==e[3]))return!1;t+=r}if(t>=e.length)return!1;let o=e[t++];if(!o)return!1;for(let i=0;i<o;i++){if(t+2>e.length)return!1;let r=e[t]<<8|e[t+1];if(t+=2,r<1||t+r>e.length||(e[t]&31)!==8)return!1;t+=r}return!0}function Xs(e){let t=[],n=new DataView(e.buffer,e.byteOffset,e.byteLength);for(let o=0;o+4<=e.length;){let i=n.getUint32(o);if(o+=4,!i||o+i>e.length)break;t.push(e.subarray(o,o+i)),o+=i}return t}function Ws(e){let t=[];for(let a=1;a<e.length;a++)a>=3&&e[a]===3&&e[a-1]===0&&e[a-2]===0||t.push(e[a]);let n=24,o=()=>{let a=t[n>>3]>>7-(n&7)&1;return n++,a},i=()=>{let a=0;for(;n<t.length*8&&!o();)a++;let c=0;for(let u=0;u<a;u++)c=c*2+o();return 2**a-1+c};i();let r=i();return r===3&&o(),{chroma:r,lumaBits:i(),chromaBits:i()}}function qs(e){let t=Xs(e),n=t.filter(r=>(r[0]&31)===7),o=t.filter(r=>(r[0]&31)===8);if(!n.length||!o.length||n[0].length<4)return null;let i=[1,n[0][1],n[0][2],n[0][3],255,224|n.length];for(let r of n)i.push(r.length>>8,r.length&255,...r);i.push(o.length);for(let r of o)i.push(r.length>>8,r.length&255,...r);if(Hs.has(n[0][1])){let r=Ws(n[0]);i.push(252|r.chroma&3,248|r.lumaBits&7,248|r.chromaBits&7,0)}return Uint8Array.from(i)}function To(e){let t=[];for(let n of e){let o=t[t.length-1];o&&o[1]===n?o[0]++:t.push([1,n])}return t}function _o({width:e,height:t,timescale:n=9e4,audio:o=null}){let i=[],r=[],a=null,c=null;function u(){if(!o||!r.length)return null;let s=o.sampleRate,l=o.numberOfChannels,p=r[0].ts,f=r.map(v=>Math.round((v.ts-p)*s/1e6)),h=Math.round(r[r.length-1].dur*s/1e6)||(o.codec==="aac"?1024:960),y=f.map((v,M)=>M+1<f.length?Math.max(1,f[M+1]-v):h),E;if(o.codec==="aac"){if(!c)throw new Error("The audio encoder gave no AAC decoder configuration (AudioSpecificConfig)");E=Te("mp4a",v=>{v.zeros(6).u16(1).zeros(8).u16(l).u16(16).u16(0).u16(0).u32(s<=65535?s*65536:0),v.bytes(js(c,o.bitrate||128e3))})}else{let v=gn(c),M=v?v.preSkip:312;E=Te("Opus",x=>{x.zeros(6).u16(1).zeros(8).u16(l).u16(16).u16(0).u16(0).u32(48e3*65536),x.bytes(Te("dOps",S=>S.u8(0).u8(l).u16(M).u32(s).u16(0).u8(0)))})}return{rate:s,durs:y,entry:E,mediaDur:y.reduce((v,M)=>v+M,0)}}return{addChunk(s,l){l&&l.decoderConfig&&l.decoderConfig.description&&!a&&(a=xi(l.decoderConfig.description));let p=new Uint8Array(s.byteLength);s.copyTo(p),i.push({data:p,key:s.type==="key",ts:s.timestamp,dur:s.duration||0})},addSample(s,{key:l,timestamp:p,duration:f}){i.push({data:s,key:!!l,ts:p,dur:f||0})},setDescription(s){a=s},addAudioChunk(s,l){l&&l.decoderConfig&&l.decoderConfig.description&&!c&&(c=xi(l.decoderConfig.description));let p=new Uint8Array(s.byteLength);s.copyTo(p),r.push({data:p,ts:s.timestamp,dur:s.duration||0})},addAudioSample(s,{timestamp:l,duration:p}){r.push({data:s,ts:l,dur:p||0})},setAudioDescription(s){c=s},finish(){if(!i.length)throw new Error("No video frames were encoded");if(!Vs(a)){let W=i.find(Y=>Y.key)||i[0];a=qs(W.data)||a}if(!a)throw new Error("The encoder gave no H.264 decoder configuration (avcC)");let s=W=>Math.round(W*n/1e6),l=i.map(W=>s(W.ts)),p=l.slice().sort((W,Y)=>W-Y),f=s(i[i.length-1].dur)||(p.length>1?p[p.length-1]-p[p.length-2]:s(33333)),h=p.map((W,Y)=>Y+1<p.length?p[Y+1]-W:f),y=l.map((W,Y)=>W-p[Y]),E=y.some(W=>W!==0),v=h.reduce((W,Y)=>W+Y,0),M=Math.round(v*1e3/n),x=To(h),S=To(y),b=i.map((W,Y)=>W.key?Y+1:0).filter(Boolean),_=i.reduce((W,Y)=>W+Y.data.length,0),L=u(),P=L?Math.round(L.mediaDur*1e3/L.rate):0,R=L?r.reduce((W,Y)=>W+Y.data.length,0):0,j=Math.max(M,P),C=_+R,D=Te("ftyp",W=>W.str("isom").u32(512).str("isom").str("iso2").str("avc1").str("mp41")),F=()=>Te("dinf",W=>W.bytes(Ee("dref",0,0,Y=>{Y.u32(1),Y.bytes(Ee("url ",0,1,()=>{}))}))),I=W=>Ee("stsc",0,0,Y=>Y.u32(1).u32(1).u32(W).u32(1)),N=W=>Ee("stsz",0,0,Y=>{Y.u32(0).u32(W.length);for(let be of W)Y.u32(be.data.length)}),z=W=>Ee("stco",0,0,Y=>Y.u32(1).u32(W)),se=W=>Te("moov",Y=>{Y.bytes(Ee("mvhd",0,0,be=>{be.u32(0).u32(0).u32(1e3).u32(j).u32(65536).u16(256).zeros(10),So.forEach(ce=>be.u32(ce)),be.zeros(24).u32(L?3:2)})),Y.bytes(Te("trak",be=>{be.bytes(Ee("tkhd",0,3,ce=>{ce.u32(0).u32(0).u32(1).u32(0).u32(M).zeros(8).u16(0).u16(0).u16(0).u16(0),So.forEach(le=>ce.u32(le)),ce.u32(e<<16).u32(t<<16)})),be.bytes(Te("mdia",ce=>{ce.bytes(Ee("mdhd",0,0,le=>le.u32(0).u32(0).u32(n).u32(v).u16(21956).u16(0))),ce.bytes(Ee("hdlr",0,0,le=>le.u32(0).str("vide").zeros(12).str("VideoHandler").u8(0))),ce.bytes(Te("minf",le=>{le.bytes(Ee("vmhd",0,1,me=>me.u16(0).u16(0).u16(0).u16(0))),le.bytes(F()),le.bytes(Te("stbl",me=>{me.bytes(Ee("stsd",0,0,pe=>{pe.u32(1),pe.bytes(Te("avc1",ge=>{ge.zeros(6).u16(1).zeros(16).u16(e).u16(t).u32(4718592).u32(4718592).u32(0).u16(1);let xe=Ao.encode("image-to-pixel").slice(0,31);ge.u8(xe.length).bytes(xe).zeros(31-xe.length).u16(24).u16(65535),ge.bytes(Te("avcC",ke=>ke.bytes(a)))}))})),me.bytes(Ee("stts",0,0,pe=>{pe.u32(x.length);for(let[ge,xe]of x)pe.u32(ge).u32(xe)})),E&&me.bytes(Ee("ctts",1,0,pe=>{pe.u32(S.length);for(let[ge,xe]of S)pe.u32(ge).u32(xe>>>0)})),b.length<i.length&&me.bytes(Ee("stss",0,0,pe=>{pe.u32(b.length);for(let ge of b)pe.u32(ge)})),me.bytes(I(i.length)),me.bytes(N(i)),me.bytes(z(W))}))}))}))})),L&&Y.bytes(Te("trak",be=>{be.bytes(Ee("tkhd",0,3,ce=>{ce.u32(0).u32(0).u32(2).u32(0).u32(P).zeros(8).u16(0).u16(1).u16(256).u16(0),So.forEach(le=>ce.u32(le)),ce.u32(0).u32(0)})),be.bytes(Te("mdia",ce=>{ce.bytes(Ee("mdhd",0,0,le=>le.u32(0).u32(0).u32(L.rate).u32(L.mediaDur).u16(21956).u16(0))),ce.bytes(Ee("hdlr",0,0,le=>le.u32(0).str("soun").zeros(12).str("SoundHandler").u8(0))),ce.bytes(Te("minf",le=>{le.bytes(Ee("smhd",0,0,me=>me.u16(0).u16(0))),le.bytes(F()),le.bytes(Te("stbl",me=>{me.bytes(Ee("stsd",0,0,ge=>{ge.u32(1),ge.bytes(L.entry)}));let pe=To(L.durs);me.bytes(Ee("stts",0,0,ge=>{ge.u32(pe.length);for(let[xe,ke]of pe)ge.u32(xe).u32(ke)})),me.bytes(I(r.length)),me.bytes(N(r)),me.bytes(z(W+_))}))}))}))}))}),de=se(0).length,oe=D.length+de+8;if(oe+C>4294967295)throw new Error("Video is larger than 4 GB");let ee=se(oe),te=new Uint8Array(oe+C);te.set(D,0),te.set(ee,D.length),new DataView(te.buffer).setUint32(D.length+ee.length,C+8),te.set(Ao.encode("mdat"),D.length+ee.length+4);let ue=oe;for(let W of i)te.set(W.data,ue),ue+=W.data.length;if(L)for(let W of r)te.set(W.data,ue),ue+=W.data.length;return te}}}var Ao,jn,Ee,So,xi,Gn,wi,Hs,vi=xt(()=>{Nn();Ao=new TextEncoder,jn=class{constructor(){this.parts=[],this.size=0}u8(t){return this.bytes([t&255])}u16(t){return this.bytes([t>>>8&255,t&255])}u32(t){return this.bytes([t>>>24&255,t>>>16&255,t>>>8&255,t&255])}str(t){return this.bytes(Ao.encode(t))}bytes(t){let n=t instanceof Uint8Array?t:Uint8Array.from(t);return this.parts.push(n),this.size+=n.length,this}zeros(t){return this.bytes(new Uint8Array(t))}out(){let t=new Uint8Array(this.size),n=0;for(let o of this.parts)t.set(o,n),n+=o.length;return t}};Ee=(e,t,n,o)=>Te(e,i=>{i.u8(t).u8(n>>16).u8(n>>8).u8(n),o(i)}),So=[65536,0,0,0,65536,0,0,0,1073741824],xi=e=>new Uint8Array(e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)),Gn=(e,t)=>[e,t.length,...t],wi=e=>[e>>>24&255,e>>>16&255,e>>>8&255,e&255];Hs=new Set([100,110,122,244,44,83,86,118,128,138,139,134,135])});function Ks(e){let t=new Uint8Array(8);t[0]=1;let n=e;for(let o=7;o>=1;o--)t[o]=n%256,n=Math.floor(n/256);return t}function Mi(e){let t=[];for(let n=e;n>0;n=Math.floor(n/256))t.unshift(n%256);return t}function Hn(e){let t=0;for(let i of e)t+=i.length;let n=new Uint8Array(t),o=0;for(let i of e)n.set(i,o),o+=i.length;return n}function Lo({width:e,height:t,codec:n="vp9",fps:o=0,audio:i=null}){if(i&&i.codec&&i.codec!=="opus")throw new Error(`WebM audio must be Opus, not ${i.codec}`);let r=[],a=[],c=null,u=null;return{addChunk(s,l){l&&l.decoderConfig&&l.decoderConfig.description&&!c&&(c=ki(l.decoderConfig.description));let p=new Uint8Array(s.byteLength);s.copyTo(p),r.push({data:p,key:s.type==="key",ms:s.timestamp/1e3})},addFrame(s,{key:l,timestamp:p}){r.push({data:s,key:!!l,ms:p/1e3})},addAudioChunk(s,l){l&&l.decoderConfig&&l.decoderConfig.description&&!u&&(u=ki(l.decoderConfig.description));let p=new Uint8Array(s.byteLength);s.copyTo(p),a.push({data:p,ms:s.timestamp/1e3,dms:(s.duration||0)/1e3})},addAudioFrame(s,{timestamp:l,duration:p}){a.push({data:s,ms:l/1e3,dms:(p||0)/1e3})},finish(){if(!r.length)throw new Error("No video frames were encoded");let s=!!(i&&a.length),l=o?1e3/o:r.length>1?(r[r.length-1].ms-r[0].ms)/(r.length-1):33.333,p=r[r.length-1].ms+l;if(s){let I=a[a.length-1];p=Math.max(p,I.ms+(I.dms||20))}let f=Pe(q.Info,[he(q.TimestampScale,1e6),Ei(q.Duration,p),bn(q.MuxingApp,"image-to-pixel"),bn(q.WritingApp,"image-to-pixel")]),h=[Pe(q.TrackEntry,[he(q.TrackNumber,rn),he(q.TrackUID,rn),he(q.TrackType,1),he(q.FlagLacing,0),bn(q.CodecID,Zs[n]||n),...c?[Ot(q.CodecPrivate,c)]:[],he(q.DefaultDuration,Math.round(l*1e6)),Pe(q.Video,[he(q.PixelWidth,e),he(q.PixelHeight,t)])])];if(s){let I=gn(u)?u:yi(i.numberOfChannels,i.sampleRate),N=gn(I).preSkip;h.push(Pe(q.TrackEntry,[he(q.TrackNumber,Po),he(q.TrackUID,Po),he(q.TrackType,2),he(q.FlagLacing,0),bn(q.CodecID,"A_OPUS"),Ot(q.CodecPrivate,I),he(q.CodecDelay,Math.round(N*1e9/48e3)),he(q.SeekPreRoll,8e7),Pe(q.Audio,[Ei(q.SamplingFrequency,i.sampleRate),he(q.Channels,i.numberOfChannels)])]))}let y=Pe(q.Tracks,h),E=r.map((I,N)=>({track:rn,data:I.data,key:I.key,ms:I.ms,order:N}));s&&a.forEach((I,N)=>E.push({track:Po,data:I.data,key:!0,ms:I.ms,order:r.length+N})),s&&E.sort((I,N)=>I.ms-N.ms||I.track-N.track||I.order-N.order);let v=[],M=null;for(let I of E){let N=Math.round(I.ms),z=I.track===rn&&I.key;(!M||z||N-M.start>3e4)&&(M={start:N,key:z,blocks:[]},v.push(M));let se=new Uint8Array(4);se[0]=128|I.track,new DataView(se.buffer).setInt16(1,N-M.start),se[3]=I.key?128:0,M.blocks.push(Ot(q.SimpleBlock,Hn([se,I.data])))}let x=v.map(I=>Pe(q.Cluster,[he(q.Timestamp,I.start),...I.blocks])),S=(I,N,z)=>Pe(q.SeekHead,[[q.Info,I],[q.Tracks,N],[q.Cues,z]].map(([se,de])=>Pe(q.Seek,[Ot(q.SeekID,Uint8Array.from(Mi(se))),he(q.SeekPosition,de,8)]))),_=S(0,0,0).length,L=_+f.length,P=L+y.length,R=[];v.forEach((I,N)=>{I.key&&R.push(Pe(q.CuePoint,[he(q.CueTime,I.start),Pe(q.CueTrackPositions,[he(q.CueTrack,rn),he(q.CueClusterPosition,P)])])),P+=x[N].length});let j=Pe(q.Cues,R.length?R:[Pe(q.CuePoint,[he(q.CueTime,0),Pe(q.CueTrackPositions,[he(q.CueTrack,rn),he(q.CueClusterPosition,L+y.length)])])]),C=P,D=Pe(q.EBML,[he(q.EBMLVersion,1),he(q.EBMLReadVersion,1),he(q.EBMLMaxIDLength,4),he(q.EBMLMaxSizeLength,8),bn(q.DocType,"webm"),he(q.DocTypeVersion,4),he(q.DocTypeReadVersion,2)]),F=Pe(q.Segment,[S(_,L,C),f,y,...x,j]);return Hn([D,F])}}}var Ys,Ot,he,bn,Ei,Pe,q,Zs,rn,Po,ki,Ci=xt(()=>{Nn();Ys=new TextEncoder;Ot=(e,t)=>Hn([Uint8Array.from(Mi(e)),Ks(t.length),t]),he=(e,t,n=0)=>{let o=[];for(let i=t;i>0||o.length===0;i=Math.floor(i/256))o.unshift(i%256);for(;o.length<n;)o.unshift(0);return Ot(e,Uint8Array.from(o))},bn=(e,t)=>Ot(e,Ys.encode(t)),Ei=(e,t)=>{let n=new Uint8Array(8);return new DataView(n.buffer).setFloat64(0,t),Ot(e,n)},Pe=(e,t)=>Ot(e,Hn(t)),q={EBML:440786851,EBMLVersion:17030,EBMLReadVersion:17143,EBMLMaxIDLength:17138,EBMLMaxSizeLength:17139,DocType:17026,DocTypeVersion:17031,DocTypeReadVersion:17029,Segment:408125543,SeekHead:290298740,Seek:19899,SeekID:21419,SeekPosition:21420,Info:357149030,TimestampScale:2807729,Duration:17545,MuxingApp:19840,WritingApp:22337,Tracks:374648427,TrackEntry:174,TrackNumber:215,TrackUID:29637,TrackType:131,FlagLacing:156,CodecID:134,CodecPrivate:25506,DefaultDuration:2352003,Video:224,PixelWidth:176,PixelHeight:186,CodecDelay:22186,SeekPreRoll:22203,Audio:225,SamplingFrequency:181,Channels:159,Cluster:524531317,Timestamp:231,SimpleBlock:163,Cues:475249515,CuePoint:187,CueTime:179,CueTrackPositions:183,CueTrack:247,CueClusterPosition:241},Zs={vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1"},rn=1,Po=2,ki=e=>new Uint8Array(e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength))});var Ro={};ji(Ro,{audioCodecSupported:()=>Bn,createMp4Muxer:()=>_o,createVideoEncoder:()=>_i,createWebmMuxer:()=>Lo,decodeAudio:()=>bi,encodeAudio:()=>Co,encodeVideo:()=>ec,estimateFps:()=>On,findAudioConfig:()=>zn,forEachFrame:()=>Dn,frameTimes:()=>yo,seekTo:()=>Xt,videoReady:()=>nn,videoSupport:()=>Js});async function Js(e=640,t=480){let n={mp4:!1,webm:!1,webcodecs:typeof VideoEncoder<"u",aac:!1,opus:!1};if(n.webcodecs){for(let o of Ti)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.mp4=!0;break}for(let[o]of Ai)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.webm=!0;break}}return n.aac=await Bn("aac"),n.opus=await Bn("opus"),n}async function Qs(e,t,n){let o=e==="mp4"?["aac","opus"]:["opus"];for(let i of o){let r=await zn(i,t.sampleRate,t.numberOfChannels,n);if(r)return{codec:i,config:r}}return null}async function _i(e){let t=Math.max(1,Math.round(e.scale||1)),n=Si(e.width*t),o=Si(e.height*t),i=e.fps||30,r=e.bitrate||Math.min(2e7,Math.max(2e6,n*o*i*.15));if(typeof VideoEncoder>"u")throw new Error("This browser has no WebCodecs VideoEncoder. Export a GIF or PNG sequence instead.");let a=null,c=null,u=e.format==="mp4"?Ti.map(b=>[b,"avc"]):Ai;for(let[b,_]of u)if((await VideoEncoder.isConfigSupported({codec:b,width:n,height:o,bitrate:r,framerate:i}).catch(()=>({}))).supported){a=b,c=_;break}if(!a)throw new Error(`No ${e.format.toUpperCase()} encoder available in this browser at ${n}\xD7${o}.`);let s=e.audio&&e.audio.channels&&e.audio.channels.length?e.audio:null,l=s?await Qs(e.format,s,e.audioBitrate||128e3):null,p=l?l.codec:null,f=l?{codec:p,sampleRate:l.config.sampleRate,numberOfChannels:l.config.numberOfChannels,bitrate:l.config.bitrate||128e3}:null,h=e.format==="mp4"?_o({width:n,height:o,audio:f}):Lo({width:n,height:o,codec:c,fps:i,audio:f}),y=null,E=new VideoEncoder({output:(b,_)=>h.addChunk(b,_),error:b=>{y=b}});E.configure({codec:a,width:n,height:o,bitrate:r,framerate:i,latencyMode:"quality",...e.format==="mp4"?{avc:{format:"avc"}}:{}});let v=new OffscreenCanvas(n,o),M=v.getContext("2d"),x=0,S=1e6/i;return{width:n,height:o,codec:a,audioCodec:p,async add(b){if(y)throw y;let _=t>1?Rt(b,t):b;M.fillStyle="#000",M.fillRect(0,0,n,o),M.putImageData(new ImageData(new Uint8ClampedArray(_.data),_.width,_.height),0,0);let L=new VideoFrame(v,{timestamp:Math.round(x*S),duration:Math.round(S)});E.encode(L,{keyFrame:x%Math.max(1,Math.round(i*2))===0}),L.close(),x++,E.encodeQueueSize>8&&await new Promise(P=>setTimeout(P,0))},async finish(){if(await E.flush(),y)throw y;return E.close(),p&&x>0&&await Co(s,{config:l.config,maxDuration:x/i,onChunk:(b,_)=>h.addAudioChunk(b,_)}),new Blob([h.finish()],{type:e.format==="mp4"?"video/mp4":"video/webm"})}}}async function ec(e,t){let n=await _i({...t,width:e[0].width,height:e[0].height});for(let o of e)await n.add(o);return n.finish()}var Ti,Ai,Si,Uo=xt(()=>{vi();Ci();Nn();Vt();Fn();Ti=["avc1.640033","avc1.4d0033","avc1.42003e","avc1.640028","avc1.42001f"],Ai=[["vp09.00.10.08","vp9"],["vp8","vp8"]];Si=e=>e+(e&1)});var an=[{id:"1-bit-monitor",name:"1-Bit Monitor",author:"",colors:["222323","f0f6f0"]},{id:"apollo",name:"Apollo",author:"AdamCYounis",colors:["172038","253a5e","3c5e8b","4f8fba","73bed3","a4dddb","19332d","25562e","468232","75a743","a8ca58","d0da91","4d2b32","7a4841","ad7757","c09473","d7b594","e7d5b3","341c27","602c2c","884b2b","be772b","de9e41","e8c170","241527","411d31","752438","a53030","cf573c","da863e","1e1d39","402751","7a367b","a23e8c","c65197","df84a5","090a14","10141f","151d28","202e37","394a50","577277","819796","a8b5b2","c7cfcc","ebede9"]},{id:"batpalette",name:"Batpalette",author:"el Rojaz",colors:["000000","7f7f7f","ffffff","681e99","3f48cc","88ff82","bfa621","cc3d18"]},{id:"beached-boogaloo",name:"Beached Boogaloo",author:".tomais",colors:["ff0b20","8f0434","500037","a0ff00","57e71e","0ea717","057833","2cdeef","2483e7","153ab7","0d0a87","ff0b88","a60fff","6409cf","eaef30","ff880b","b75308","802202","000000","231940","514378","ffffff","73a3a7","366770","f7b771","c77650","974c38","873939","601e2c","300c1f"]},{id:"cc-29",name:"CC-29",author:"Alpha6",colors:["f2f0e5","b8b5b9","868188","646365","45444f","3a3858","212123","352b42","43436a","4b80ca","68c2d3","a2dcc7","ede19e","d3a068","b45252","6a536e","4b4158","80493a","a77b5b","e5ceb4","c2d368","8ab060","567b79","4e584a","7b7243","b2b47e","edc8c4","cf8acb","5f556a"]},{id:"cga-16",name:"CGA 16",author:"",colors:["000000","0000aa","00aa00","00aaaa","aa0000","aa00aa","aa5500","aaaaaa","555555","5555ff","55ff55","55ffff","ff5555","ff55ff","ffff55","ffffff"]},{id:"chaotic-neutral",name:"Chaotic neutral",author:"Dodecahedron \u2DFD",colors:["e1d4cb","c19f90","a56457","6d504d","484044","392b29","31312f","d8eef0","97999f","81a4c0","6a7f92","415973","43425a","45334b","4b1f40","671087","955ab9"]},{id:"endesga-32",name:"Endesga 32",author:"ENDESGA",colors:["be4a2f","d77643","ead4aa","e4a672","b86f50","733e39","3e2731","a22633","e43b44","f77622","feae34","fee761","63c74d","3e8948","265c42","193c3e","124e89","0099db","2ce8f5","ffffff","c0cbdc","8b9bb4","5a6988","3a4466","262b44","181425","ff0044","68386c","b55088","f6757a","e8b796","c28569"]},{id:"fantasy-24",name:"Fantasy 24",author:"",colors:["1f240a","39571c","a58c27","efac28","efd8a1","ab5c1c","183f39","ef692f","efb775","a56243","773421","724113","2a1d0d","392a1c","684c3c","927e6a","276468","ef3a0c","45230d","3c9f9c","9b1a0a","36170c","550f0a","300f0a"]},{id:"game-boy-dmg",name:"Game Boy (DMG)",author:"",colors:["0f380f","306230","8bac0f","9bbc0f"]},{id:"grayscale-4",name:"Grayscale 4",author:"",colors:["000000","555555","aaaaaa","ffffff"]},{id:"hidden-library",name:"Hidden Library",author:"Pixel Hoo",colors:["100b2a","2a213a","314743","65856d","adca9a","ecfeca","582d27","974133","d67654","5d3441","a3685b","ffb379","ffe6a9","ffffff"]},{id:"intacto14",name:"Intacto14",author:"Anubi",colors:["221529","4b5561","879ba3","cbf5ef","62b4de","5660d6","5b29a6","d64562","f2735c","edbb8e","ab6375","522152","37ada2","8cde8c"]},{id:"journey",name:"Journey",author:"\u{1F34D}PineappleOnPizza\u{1F34D}",colors:["050914","110524","3b063a","691749","9c3247","d46453","f5a15d","ffcf8e","ff7a7d","ff417d","d61a88","94007a","42004e","220029","100726","25082c","3d1132","73263d","bd4035","ed7b39","ffb84a","fff540","c6d831","77b02a","429058","2c645e","153c4a","052137","0e0421","0c0b42","032769","144491","488bd4","78d7ff","b0fff1","faffff","c7d4e1","928fb8","5b537d","392946","24142c","0e0f2c","132243","1a466b","10908e","28c074","3dff6e","f8ffb8","f0c297","cf968c","8f5765","52294b","0f022e","35003b","64004c","9b0e3e","d41e3c","ed4c40","ff9757","d4662f","9c341a","691b22","450c28","2d002e"]},{id:"lospec500",name:"Lospec500",author:"",colors:["10121c","2c1e31","6b2643","ac2847","ec273f","94493a","de5d3a","e98537","f3a833","4d3533","6e4c30","a26d3f","ce9248","dab163","e8d282","f7f3b7","1e4044","006554","26854c","5ab552","9de64e","008b8b","62a477","a6cb96","d3eed3","3e3b65","3859b3","3388de","36c5f4","6dead6","5e5b8c","8c78a5","b0a7b8","deceed","9a4d76","c878af","cc99ff","fa6e79","ffa2ac","ffd1d5","f6e8e0","ffffff"]},{id:"nyx8",name:"Nyx8",author:"Javier Guerrero",colors:["08141e","0f2a3f","20394f","4e495f","816271","997577","c3a38a","f6d6bd"]},{id:"oil-6",name:"Oil 6",author:"",colors:["fbf5ef","f2d3ab","c69fa5","8b6d9c","494d7e","272744"]},{id:"pico-8",name:"PICO-8",author:"",colors:["000000","1d2b53","7e2553","008751","ab5236","5f574f","c2c3c7","fff1e8","ff004d","ffa300","ffec27","00e436","29adff","83769c","ff77a8","ffccaa"]},{id:"resurrect-64",name:"Resurrect 64",author:"Kerrie Lake",colors:["2e222f","3e3546","625565","966c6c","ab947a","694f62","7f708a","9babb2","c7dcd0","ffffff","6e2727","b33831","ea4f36","f57d4a","ae2334","e83b3b","fb6b1d","f79617","f9c22b","7a3045","9e4539","cd683d","e6904e","fbb954","4c3e24","676633","a2a947","d5e04b","fbff86","165a4c","239063","1ebc73","91db69","cddf6c","313638","374e4a","547e64","92a984","b2ba90","0b5e65","0b8a8f","0eaf9b","30e1b9","8ff8e2","323353","484a77","4d65b4","4d9be6","8fd3ff","45293f","6b3e75","905ea9","a884f3","eaaded","753c54","a24b6f","cf657f","ed8099","831c5d","c32454","f04f78","f68181","fca790","fdcbb0"]},{id:"slso8",name:"SLSO8",author:"Luis Miguel Maldonado",colors:["0d2b45","203c56","544e68","8d697a","d08159","ffaa5e","ffd4a3","ffecd6"]},{id:"sweet-canyon-extended-64",name:"Sweet Canyon Extended 64",author:"Mr Slime",colors:["0f0e11","2d2c33","40404a","51545c","6b7179","7c8389","a8b2b6","d5d5d5","eeebe0","f1dbb1","eec99f","e1a17e","cc9562","ab7b49","9a643a","86482f","783a29","6a3328","541d29","42192c","512240","782349","8b2e5d","a93e89","d062c8","ec94ea","f2bdfc","eaebff","a2fafa","64e7e7","54cfd8","2fb6c3","2c89af","25739d","2a5684","214574","1f2966","101445","3c0d3b","66164c","901f3d","bb3030","dc473c","ec6a45","fb9b41","f0c04c","f4d66e","fffb76","ccf17a","97d948","6fba3b","229443","1d7e45","116548","0c4f3f","0a3639","251746","48246d","69189c","9f20c0","e527d2","ff51cf","ff7ada","ff9edb"]},{id:"sweetie-16",name:"Sweetie 16",author:"",colors:["1a1c2c","5d275d","b13e53","ef7d57","ffcd75","a7f070","38b764","257179","29366f","3b5dc9","41a6f6","73eff7","f4f4f4","94b0c2","566c86","333c57"]},{id:"toxic-haze",name:"Toxic Haze",author:"sillyTheJester",colors:["e5ff00","b8d14a","9ab06e","708763","4c5c52","393e40","242424"]},{id:"vinik24",name:"Vinik24",author:"Vinik",colors:["000000","6f6776","9a9a97","c5ccb8","8b5580","c38890","a593a5","666092","9a4f50","c28d75","7ca1c0","416aa3","8d6268","be955c","68aca9","387080","6e6962","93a167","6eaa78","557064","9d9f7f","7e9e99","5d6872","433455"]}];function Yn(e){let t=String(e||"").toLowerCase();return an.find(n=>n.id===t||n.name.toLowerCase()===t)||null}vt();var kn=1,En=2048,cn=[{id:"none",label:"None",kind:"none"},{id:"bayer2",label:"Bayer 2\xD72",kind:"ordered"},{id:"bayer4",label:"Bayer 4\xD74",kind:"ordered"},{id:"bayer8",label:"Bayer 8\xD78",kind:"ordered"},{id:"bayer16",label:"Bayer 16\xD716",kind:"ordered"},{id:"cluster4",label:"Clustered dot 4\xD74",kind:"ordered"},{id:"cluster8",label:"Clustered dot 8\xD78",kind:"ordered"},{id:"lines",label:"Horizontal lines",kind:"ordered"},{id:"bluenoise",label:"Blue noise",kind:"ordered"},{id:"custom",label:"Custom matrix",kind:"ordered"},{id:"floyd-steinberg",label:"Floyd\u2013Steinberg",kind:"diffusion"},{id:"atkinson",label:"Atkinson",kind:"diffusion"},{id:"sierra-lite",label:"Sierra Lite",kind:"diffusion"},{id:"sierra",label:"Sierra",kind:"diffusion"},{id:"burkes",label:"Burkes",kind:"diffusion"},{id:"jarvis",label:"Jarvis\u2013Judice\u2013Ninke",kind:"diffusion"},{id:"stucki",label:"Stucki",kind:"diffusion"}],Mn=e=>(cn.find(t=>t.id===e)||{kind:"none"}).kind;var Hi=Object.freeze({version:kn,size:{mode:"width",width:96,height:0,block:8,resample:"box"},adjust:{brightness:0,contrast:0,saturation:0,hue:0,gamma:1},frame:{aspect:"original",zoom:1,x:.5,y:.5},palette:{source:"builtin",id:"endesga-32",name:"Endesga 32",colors:[],count:16,distance:"oklab"},dither:{method:"bayer4",strength:.6,matrix:null},alpha:{threshold:.5},cleanup:{orphans:!1,smooth:!1},outline:{mode:"none",color:"#000000",corners:!1},export:{size:"scale",scale:4,indexed:!0,grid:!1,gridColor:"#000000"}}),Ue=(e,t,n,o)=>{let i=Number(e);return Number.isFinite(i)?Math.min(n,Math.max(t,i)):o},Gt=(e,t,n)=>t.includes(e)?e:n,sn=(e,t)=>typeof e=="boolean"?e:t;function Et(){return at({})}function at(e={}){let t=Hi,n=e||{},o={},i=n.size||{},r=n.adjust||{},a=n.palette||{},c=n.dither||{},u=n.alpha||{},s=n.cleanup||{},l=n.outline||{},p=n.export||{};o.version=kn,o.size={mode:Gt(i.mode,["width","block"],t.size.mode),width:Math.round(Ue(i.width,1,En,t.size.width)),height:Math.round(Ue(i.height,0,En,t.size.height)),block:Ue(i.block,1,256,t.size.block),resample:Gt(i.resample,["box","nearest"],t.size.resample)},o.adjust={brightness:Ue(r.brightness,-1,1,0),contrast:Ue(r.contrast,-1,1,0),saturation:Ue(r.saturation,-1,1,0),hue:Ue(r.hue,-180,180,0),gamma:Ue(r.gamma,.2,5,1)};let f=n.frame||{};o.frame={aspect:Gt(f.aspect,Jt.map(E=>E.id),"original"),zoom:Ue(f.zoom,1,8,1),x:Ue(f.x,0,1,.5),y:Ue(f.y,0,1,.5)};let h=Gt(a.source,["builtin","custom","extract","none"],t.palette.source);if(o.palette={source:h,id:typeof a.id=="string"?a.id:h==="builtin"?t.palette.id:"",name:typeof a.name=="string"?a.name:"",colors:[],count:Math.round(Ue(a.count,2,256,t.palette.count)),distance:Gt(a.distance,["oklab","rgb"],t.palette.distance)},h==="builtin"){let E=Yn(o.palette.id)||Yn(t.palette.id);o.palette.id=E.id,o.palette.name=E.name,o.palette.colors=E.colors.map(v=>"#"+v)}else h==="custom"?(o.palette.colors=(Array.isArray(a.colors)?a.colors:[]).filter(wn).map(Xe).slice(0,256),o.palette.colors.length||(o.palette.colors=["#000000","#ffffff"]),o.palette.name=o.palette.name||"Custom"):h==="extract"?o.palette.name=`Extracted (${o.palette.count})`:o.palette.name="None";let y=cn.some(E=>E.id===c.method)?c.method:t.dither.method;return o.dither={method:y,strength:Ue(c.strength,0,1,t.dither.strength),matrix:Vi(c.matrix)},o.alpha={threshold:Ue(u.threshold,0,1,t.alpha.threshold)},o.cleanup={orphans:sn(s.orphans,!1),smooth:sn(s.smooth,!1)},o.outline={mode:Gt(l.mode,["none","outer","inner"],"none"),color:wn(l.color)?Xe(l.color):t.outline.color,corners:sn(l.corners,!1)},o.export={size:Gt(p.size,["scale","source"],"scale"),scale:Math.round(Ue(p.scale,1,64,t.export.scale)),indexed:sn(p.indexed,t.export.indexed),grid:sn(p.grid,!1),gridColor:wn(p.gridColor)?Xe(p.gridColor):t.export.gridColor},o}function Vi(e){if(!Array.isArray(e)||!e.length||!Array.isArray(e[0]))return null;let t=Math.min(16,e.length),n=Math.min(16,e[0].length),o=[];for(let i=0;i<t;i++){let r=[];for(let a=0;a<n;a++){let c=Number((e[i]||[])[a]);r.push(Number.isFinite(c)?c:0)}o.push(r)}return o}var Jt=[{id:"original",label:"Original",ratio:null},{id:"1:1",label:"1:1",ratio:1},{id:"4:3",label:"4:3",ratio:4/3},{id:"3:4",label:"3:4",ratio:3/4},{id:"3:2",label:"3:2",ratio:3/2},{id:"2:3",label:"2:3",ratio:2/3},{id:"16:9",label:"16:9",ratio:16/9},{id:"9:16",label:"9:16",ratio:9/16}];function Cn(e,t,n={}){let o=(Jt.find(s=>s.id===n.aspect)||Jt[0]).ratio||e/t,i=e,r=e/o;r>t&&(r=t,i=t*o);let a=Math.max(1,n.zoom||1);i=Math.max(1,Math.min(e,Math.round(i/a))),r=Math.max(1,Math.min(t,Math.round(r/a)));let c=n.x??.5,u=n.y??.5;return{x:Math.round((e-i)*c),y:Math.round((t-r)*u),w:i,h:r}}function Bo(e,t,n){let o,i;return n.mode==="block"?(o=Math.max(1,Math.round(e/n.block)),i=Math.max(1,Math.round(t/n.block))):(o=n.width,i=n.height||Math.max(1,Math.round(o*t/e))),{width:Math.min(En,o),height:Math.min(En,i)}}function Xi(e,t){let n={};for(let o of Object.keys(e)){if(o==="version")continue;let i=e[o],r=t[o];if(i&&typeof i=="object"&&!Array.isArray(i)){let a={};for(let c of Object.keys(i))JSON.stringify(i[c])!==JSON.stringify(r&&r[c])&&(a[c]=i[c]);Object.keys(a).length&&(n[o]=a)}else JSON.stringify(i)!==JSON.stringify(r)&&(n[o]=i)}return n}var No={enc(e){let t=new TextEncoder().encode(e),n="";for(let o of t)n+=String.fromCharCode(o);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},dec(e){let t=atob(e.replace(/-/g,"+").replace(/_/g,"/"));return new TextDecoder().decode(Uint8Array.from(t,n=>n.charCodeAt(0)))}};function Go(e){let t=at(e),n=Xi(t,Et());return n.palette&&(t.palette.source!=="custom"&&(delete n.palette.colors,delete n.palette.name),t.palette.source!=="builtin"&&delete n.palette.id,t.palette.source!=="extract"&&delete n.palette.count),n.palette&&!Object.keys(n.palette).length&&delete n.palette,n}function Jn(e){return No.enc(JSON.stringify({v:kn,...Go(e)}))}function Qn(e){let t=String(e),n=/[#&?]s=([A-Za-z0-9_-]+)/.exec(t);n&&(t=n[1]);let o=JSON.parse(No.dec(t));return delete o.v,at(o)}function Qt(e){return JSON.stringify({$schema:"image-to-pixel/settings",version:kn,...Go(e)},null,2)}function eo(e){let t=typeof e=="string"?JSON.parse(e):e;return delete t.$schema,at(t)}function Lt(e,t){let n=JSON.parse(JSON.stringify(e));for(let o of Object.keys(t||{}))t[o]&&typeof t[o]=="object"&&!Array.isArray(t[o])&&n[o]&&typeof n[o]=="object"?Object.assign(n[o],t[o]):n[o]=t[o];return at(n)}vt();var jo="DHos2hHvghjhcwXqwKFF/I5L2ny43U2CNthWL2uZuIRL+h7EVxA0YALtMcH8NbbVUPllGoW/JOwz00rvXqMkVz7EYJ7BTqNbvi6qPIwRXa4kwO9YHI8KwRmt7YvNQV/mNKB2OofloLpEyqZhCYxtF4KtQ8mZ4Ud9uQiHHTy+cdiT8wWJO2/UDP6DUtBm3jLocQ+aLq/9atWZRXgD4R/EEGjRAe6qJdB1khZ7SeCqRPAwzwl3Ll6tGP9rqt+W6hSza0+s3xryLJNAsxbxI7d9zEGHZ9NGeiRZ8WYnsVKkdvOyj1a5RmcKU+gq9ZjOIny/XY7nuPcM1p1VOs4rZkyKMhzoKHpfsMR4Ycudb5BLAZ8e96gF6pW0Ow2904T3NpJOHzLhFoH1ltc9tVoTOWXmAqIjO2ZOinMm3I8PfsMA/Muevj/SmkoB6SHcCzqv+8Vg3k29OGEXyeSHnUARacEG2ofHbZvON70gaYnbdsKujVL+c9qlHLLHRGrvtkLlpVt5CVKID/swjak9VIDoXRUzdJMmfdCKpUttLftb3Jko7mOuR/8rXg12qPwDoUbrDy7HQrYPk+Y09QisHFeZciQ93WT0r2rFVtls9pS7IMqGpu4S2FQO8yvXAK14H7R/T6M3GIAHpuuNQsxVMsghXpp73xqGW8xJfl+chMkv9hXQspEb1TYgoXsTKcEGZKFE31K/PrGabbtdgetUzjnoFcdv0Oq9adNOteITmXLwh7j5PWOg8S5xAbon1Uvha76JSukvwJl+7UPitYZK0Tb6cyoJa4P4Lt5BHZu/GouiYkT6C49XI4k4GmcqgdhBrgxQJtMIv0fXp/uP6RJ2OwOpWwx/a0ECUcsMYjSc63erFI3Mm+kiXwSMqf83cEj1B8KHny61QNig+MeX9KxeHeRqxH+pbpEjgRY6aVCftP2WKu3Iofqx422nkL31FV0f203uXLhD1KzFTnnMCtmzLNt0IOFge+0BcFEQdz0Ewn0unj7eG/RR47NX078uzR9HfthwOR5YLIUU/ylMcspAuIKeADN7D5N2NeEUZJVRfJxbO7RPyxmVwjKr3LpV6qBH/s0AkF0yxgVw8JQMc4nmZL8RT7aL3JzGPV7WiAOi6GcpyG6y2PtXGvCZKb3oIfEOyv2RBaT4R2XlhB6SLG3ZEYhUcum7n3w9oipIrvZWBa0w9J/SCGgY7Kt3G7PgM5EO/ULiUSSlOc9ptFWBOq1pQ4Ibbuc1ciKxDUph+8YZj123Hq0qShD6zWLhgCDWO5zbhV4ic/dJgDNRzvFEYHzDU62KF5h/Yb2LAkP6ywePxeCnvSpbx4PbkfG/oj56sDfJ4Tz2hNlsjSCvDsRSkLpxFkLKlT6nv9yYBYotmxD3Itx4Nbz1COch2nijG2ziXC4XVj3al7MKVDptK9UG50/1CXeiYhXBOORaQZT/agkt8ljmtADoK1tw+bdmxHKrvUZpBdVNa55BrE/pNLqHRaT5cZ3xfhRI75vPGH6WXSWoZpsoStGUVaQDt9F1M6rdyIqkIXtjiNUOJkoV5yHcUzCGpfKRH80uw3IPlF/wJ9YTu4sAzCRt4DBlt/1R4r2L2xeD7LwG8SVw+IAj5RVLe18RSdMx/ky4ocyuhlpAkgbqyxRXt37oWof+KbLQCpdUezncSmKmw4yrH4MCpzcScjLKValrOXqwyjVOnGKz7504+a9smMEVOntkNNSg/cd9YJk82yhFCqcXzFWBPHCryO5oIrD/NlII81rERXXL60yz+z8Q4I7WRw+L1wnChicCvIAe4QlX5ZL0A+MfdA43tiX3dqpn+pbWbkC55Rv0SC4HlsWAD5bedzzSl+cmjmOgBJF5wy1aHZvkW6rrOVPUauhUyj+Lq3AjUJx+wEewbOFNGL4CjMNPLvKOAaBckNuCtFnhMnDKHrWJKQ9erxf2LM9fIO6euP5pvyx5HW/2kkKmK5pn9S/E2bM88liP7xWXg9dZ7jgafKteI9J1K7wOZ/k+GqXuSWX3UKnuftpPunxE5K5OcgE8ghLvQ5q1C8YWdNcFuhd/Rg5ozycK1S1cyTqkKpV10OYKv+pQrvtA0SSdzI5UuymeAthvQ8A1bhLYlwuHNNSVx1KxjsXgTH81rvtLhexV25n6iLueabN6qOsHarjfSaFkP5iBOhaJbqhRdgPnfA7Ugze6HZ0KkPKmOGbF+hVg5yH0MF4EKGTR51iLHaw7b6gsWxtI4DX8RSBRf/ocYAwosv0bbN/HWeYS87cwZEP8rG7sjV3+ySlYgOkkUrR2pUaMbaXZdv2kGJUnwmXgJr4Jyul1AX2TEL+M3LFCyI3yzodP0jCeBrMnmDqD3sKWLFkYSsYuek3asAXNcps82Ci8B98ZP7SEO75xRe4Qlc+BTo81pfVTzmDmbg2cMHWoUzdzBLmM9mY92nHPWR6kEs3kkrEH3aQTa5dDtxvvC4j2VoDEmFLKElvxANOeeD9c/yDdYsUsshqkKT3PXOwB2R7BmuJgH0rAhaZOCI/0bk6CYzH3aIU/u+Qh+lZ/qErGbBzmM2b2JZveibBVL7njBZpysBKKceJBgvi4kyG1SYVm7BNArOp4DO4d48ItsDzfvwyfR88l81d9N47UK+FiMa+bQ7YLftFtNEsdfvlhI6lIyDjtTA6X02kUUHrfbP+jKrNaftY0n81eNXmeYdEAjSbwuHkTqZABza4SarwDk9AQ8nTUlEmqBsCj5cYPkNd28RZfob79XDK8jO0KOJgYPdCN+CWSaBlIspH2EkZ1/6ZXbzneUMIz62VL9JxGd/5TgilZFfAv4F38dStlrDpRvTCT5HsniLAF5UKhyF7Wu1V3EEjICLr8f9okVbvmhhlCy5geifxfdqEhgsYw6BqxNtzApYdoxSCNPxSYSczrCYdm0AJB2BpNzGMlca8qhQbmqdpwm1fdPqUDbNM5qSjAae0I2LIrC9NE4rEJW4jKZ58HSes4sU+feNK28oEcdKH5HqpUumvzpHeX+hbbS/dqkCE2ufQqeR1g8LSADWKY3zKqekhjooO5GI42cdelKE3wkHUf0AP4E+RYNQKn3lQqxUd+8JotP9cQN7ZZgJwZykfwYwJCrIvMlyxDlPrHTROLUyPJ8jvcT/dgw+1EEOWBFNW3YZmDbb0mlHDOXzi5jGHfNhTTi7xb7IfPAO09tS+hfc2U5GcO7FDC3R90NexvzPu1kgVtIZh1A6Milbhqwz5YLvNF3jSjS/C7IYj8F9UIkbNuVwl/JW5Koi3EdFzqDFW0GFHXtzpyCKdTugSvnTwNXjGC6bHKL+VQe/tULaD4iqQKwh5cyYQIQN+fTXOiP/YmxeSm/MevG9pglRXahqwm/HYwfx2i/odo6I7WXSCA2KPhwlUXRYvRqzYMjd0CbyDQaH6r/xbXYrB5DsQv5GSrT3scRjUFk+k2fP5NwDpn00Cd6MaQXivRFD4leEXzwExyGT+qff9hEmy61mLAPOa0R+ooTo9rNpn0KVzqgRHNhgPtmmaL0k1ougmrKJoE748Ru1wEReO8TK32yJzgC44r+ZVk7A2hwSrwlEUhfJtahA2UvtsA7bYcSM2okUa9JFrUMLreWKkVhe9C03HlV3nJTXAn+Kp0DJV7WBhqL7JlqQPRL8l1O95ZhBbjpvMSyC36XjpzpUR93YptAzLycJ7/j0pzEfh34CueXIwTti+nGPSvz4U00iLuMcGoitJU7n1GtIQcUZAAtDfHVm80Tdt0nrYZyyVgyA5W+bHVUxe1OQ3FnSc4yUe9Gss0+WXVRoMtkw1kn1C3YtYAROQRPcYX41naova/ZZz4egbUuoitHUDehfOR4zSevD0jfZfJZH/dXey1ZgSUbfR8qU6SB+vEWuM72RrpiDuSc/xagaMllXI2CGo/J+MZS6+WJf4LZO9WC2tMB655HemRZeYRQNYoqkMahk7psTNTCN0hvHWcHmymT4CycQr0pRu1LcvxYr39rYzrsobQdS/rZj99oji9kc2nNsFb/URvBsZMr++IAPltltOnfBbShr5qPu9WNrj/AsbxJkPNVyrZZpkHd0AQUCnSHk4OWpLGE9e1UM4g5Xgq+IHbJI7LrNwpn3QyX5u8NOMOMf5EmuocoovODd6JRXgZjV/kq3nASYfhUajniMmgYH7Dn/w8p1aKGuJvjEkRtlEXoGkOUzWFXfsKw9xKG4JXwXNdtidiS/sueaxmI5zaOL6gETORBuwWOMEc0TFyDPUz2XAl5AZ5+DKaAfWtZNh06UK38pfiErtGjyOneM/uoiCTyQLid8MHtU8X88xYrWr4SHPI/WSdt3b6aJRZst1DkANIuWXCQqxpv1ktyTycB4kw0ngmqGvQfOZU9jkGY0Db9EyDqTSQ12fjoEB/CessGYXfUyI91lsmoUQB8iKaY77rqIQclNQh6j/do4Ed/VjCo18DTu0/HTOzFGuSsciGDWU32RP3Rx+CM8WQKLlMj9WoAbmOr38N5YS81nc6yhZ4K1reN/VSgQ+TdBPuaLsr3hT5lMqDuJPcXJ3UJ/FSLK7CIp9YbK+X8FkA/GPccsRBYzHoaRnxUsc3E1Wr44lP/50Qy3UJpGHPsilU0kGVf0twPrIxYwz+cQLASYIPb+iWedOK58ErzhO0d0erG5oN9nzOm0S+M4ylZfOVJmcGtdJBhrNN5bwk/UXGia4G5xmozojjH9RTqkOK8zLfo74+FvhQBUAYe19C4p7RMO1aOasiVgv6eNcE4iJ6w0j3nzFfHe9oLYk+mHoLZ+oxdrhf8i0QaZ955SzHHKd4YSKI214yp3S59aLXiSNoEI16vtmK6sCGKFCdbEa1O90Vgs1z6JXCAKXSE+xW2qYbm0zZO47EVfdBuxWZatlUC839Swi2zhvfjVIzB/LAOPfJTARoF0huo+G3FcX+hAqZWbM+D6wpSn37WHHDL4E9813EIKIAd6/RB45P9TqD6rk4lqxsgJNGYSTHbrZJfZtYsCam/pov1xI+Yo4lWqjRb/Ak4FKAz2PbF7hEnQSwz4wIfP9s50UfgzXpYsMEoCVJehTHJ/EBrv+cFu2WYBnYCXPnPH/OuV31esvuOdkaTjCmjWm3+QujNpEohtb4YSNJ360xVbuY2WumzCh7sVfQkPJh5D9Z5nE31Hs+3Syp7UaL0GEeUAuPrikNqm2XffbBAdQYM5RF7HbI8VscO3fGnWcUjc8RLFr7SBSY4B78agquIoigwS2JuwxSrQKFw24xuQ+WsPB0QeVWhEfgBrJBZYRR68ZvH7xUBa1upOKTDfQ5ue9DfuywC4q6aEw5hLdB3VPVEWvLHFzpks5j90wbpPlN4DKF1h/Flvm+IFzLJOOhO3qnWOCKL+dCGb9LJ7FR1HUipGPFPHTRMfWqzBHnJ5d5NbRIl/epQnMmtjmW0lyAI27IBGSmNwdnMaDzcJIPvP0SKtUKsGeY1Xz+jNhshRiZVuIEkSOj5lMBcZJZoW/DBPuD4g==";function Wi(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):new Uint8Array(Buffer.from(e,"base64"))}function en(e){let t=[[0]];for(let n=1;n<e;n*=2){let o=[];for(let i=0;i<n*2;i++)o.push(new Array(n*2));for(let i=0;i<n;i++)for(let r=0;r<n;r++){let a=4*t[i][r];o[i][r]=a,o[i][r+n]=a+2,o[i+n][r]=a+3,o[i+n][r+n]=a+1}t=o}return t}function Vo(e){let t=e.length,n=e[0].length,o=[];for(let r=0;r<t;r++)for(let a=0;a<n;a++)o.push({i:r*n+a,v:e[r][a]});o.sort((r,a)=>r.v-a.v||r.i-a.i);let i=new Uint8Array(n*t);return o.forEach((r,a)=>{i[r.i]=a}),i}function qi(e){let t=[];for(let n=0;n<e;n++){let o=[];for(let i=0;i<e;i++){let r=(i+.5)/e*2*Math.PI,a=(n+.5)/e*2*Math.PI;o.push(-(Math.cos(r)+Math.cos(a))+(i*e+n)*1e-9)}t.push(o)}return t}var Yi=[[7,13,11,4],[12,16,14,8],[10,15,6,2],[5,9,3,1]],to=new Map;function Xo(e,t=null){if(e==="custom"){let i=t&&t.length?t:en(4);return{w:i[0].length,h:i.length,levels:i.length*i[0].length,values:Vo(i)}}if(to.has(e))return to.get(e);let n,o=i=>({w:i[0].length,h:i.length,levels:i.length*i[0].length,values:Vo(i)});switch(e){case"bayer2":n=o(en(2));break;case"bayer4":n=o(en(4));break;case"bayer8":n=o(en(8));break;case"bayer16":n=o(en(16));break;case"cluster4":n=o(Yi);break;case"cluster8":n=o(qi(8));break;case"lines":n=o([[0],[2],[1],[3]]);break;case"bluenoise":n={w:64,h:64,levels:256,values:Wi(jo)};break;default:n=o(en(4))}return to.set(e,n),n}function Wo(e){let t=String(e).split(/\r?\n|;/).map(o=>o.trim()).filter(o=>o&&!/^\//.test(o)).map(o=>o.replace(/[[\]]/g,"").split(/[\s,]+/).filter(Boolean).map(Number));if(!t.length)throw new Error("Matrix is empty");let n=t[0].length;if(t.some(o=>o.length!==n||o.some(i=>!Number.isFinite(i))))throw new Error("Every row needs the same number of values");if(n>16||t.length>16)throw new Error("Matrices are limited to 16\xD716");return t}var jt=(e,t)=>t.map(([n,o,i])=>[n,o,i/e]),qo={"floyd-steinberg":jt(16,[[1,0,7],[-1,1,3],[0,1,5],[1,1,1]]),atkinson:jt(8,[[1,0,1],[2,0,1],[-1,1,1],[0,1,1],[1,1,1],[0,2,1]]),"sierra-lite":jt(4,[[1,0,2],[-1,1,1],[0,1,1]]),sierra:jt(32,[[1,0,5],[2,0,3],[-2,1,2],[-1,1,4],[0,1,5],[1,1,4],[2,1,2],[-1,2,2],[0,2,3],[1,2,2]]),burkes:jt(32,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2]]),jarvis:jt(48,[[1,0,7],[2,0,5],[-2,1,3],[-1,1,5],[0,1,7],[1,1,5],[2,1,3],[-2,2,1],[-1,2,3],[0,2,5],[1,2,3],[2,2,1]]),stucki:jt(42,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2],[-2,2,1],[-1,2,2],[0,2,4],[1,2,2],[2,2,1]])},no=12;function Yo(e){let t=1;for(let[n,o]of e)o>0&&(t=Math.max(t,Math.floor(-n/o)+1));return t}var Ko=(e,t,n)=>e-1+n*(t-1)+1;vt();function Sn(e,t=16,n={}){let{maxSamples:o=4e4,alphaThreshold:i=.5}=n,r=e.width*e.height,a=Math.max(1,Math.floor(r/o)),c=[];for(let f=0;f<r;f+=a){let h=f*4;e.data[h+3]<i*255||c.push([e.data[h],e.data[h+1],e.data[h+2]])}if(!c.length)return["#000000","#ffffff"].slice(0,Math.max(1,t));let u=[c];for(;u.length<t;){let f=-1,h=-1,y=0;if(u.forEach((M,x)=>{if(!(M.length<2))for(let S=0;S<3;S++){let b=255,_=0;for(let P of M)P[S]<b&&(b=P[S]),P[S]>_&&(_=P[S]);let L=(_-b)*Math.sqrt(M.length);L>h&&(h=L,f=x,y=S)}}),f<0||h<=0)break;let E=u[f].slice().sort((M,x)=>M[y]-x[y]),v=E.length>>1;u.splice(f,1,E.slice(0,v),E.slice(v))}let s=u.map(f=>Ki(f));for(let f=0;f<6;f++){let h=s.map(()=>[0,0,0,0]);for(let y of c){let E=0,v=1/0;for(let x=0;x<s.length;x++){let S=y[0]-s[x][0],b=y[1]-s[x][1],_=y[2]-s[x][2],L=S*S+b*b+_*_;L<v&&(v=L,E=x)}let M=h[E];M[0]+=y[0],M[1]+=y[1],M[2]+=y[2],M[3]++}s=s.map((y,E)=>h[E][3]?[h[E][0]/h[E][3],h[E][1]/h[E][3],h[E][2]/h[E][3]]:y)}let l=[...new Set(s.map(f=>Nt(f)))],p=f=>{let h=parseInt(f.slice(1),16);return .2126*(h>>16)+.7152*(h>>8&255)+.0722*(h&255)};return l.sort((f,h)=>p(f)-p(h))}function Ki(e){let t=0,n=0,o=0;for(let i of e)t+=i[0],n+=i[1],o+=i[2];return[t/e.length,n/e.length,o/e.length]}vt();function An(e,t,n,o="box",i=null){let r=i?i.x:0,a=i?i.y:0,c=i?i.w:e.width,u=i?i.h:e.height,s=e.data,l=e.width,p=new Float32Array(t*n*4),f=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(c/t))),h=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(u/n))),y=new Int32Array(t*f),E=new Int32Array(n*h);for(let v=0;v<t;v++)for(let M=0;M<f;M++)y[v*f+M]=r+Math.min(c-1,Math.floor((2*(v*f+M)+1)*c/(2*t*f)));for(let v=0;v<n;v++)for(let M=0;M<h;M++)E[v*h+M]=a+Math.min(u-1,Math.floor((2*(v*h+M)+1)*u/(2*n*h)));for(let v=0;v<n;v++)for(let M=0;M<t;M++){let x=0,S=0,b=0,_=0;for(let P=0;P<h;P++){let R=E[v*h+P]*l;for(let j=0;j<f;j++){let C=(R+y[M*f+j])*4,D=s[C+3]/255;x+=s[C]/255*D,S+=s[C+1]/255*D,b+=s[C+2]/255*D,_+=D}}let L=(v*t+M)*4;_>0&&(p[L]=x/_,p[L+1]=S/_,p[L+2]=b/_),p[L+3]=_/(f*h)}return p}function _n(e,{brightness:t=0,contrast:n=0,saturation:o=0,hue:i=0,gamma:r=1}){if(!t&&!n&&!o&&!i&&r===1)return e;let a=n>=0?1/(1-.99*n):1+n,c=1/r,u=Math.cos(i*Math.PI/180),s=Math.sin(i*Math.PI/180),l=[.213+.787*u-.213*s,.715-.715*u-.715*s,.072-.072*u+.928*s,.213-.213*u+.143*s,.715+.285*u+.14*s,.072-.072*u-.283*s,.213-.213*u-.787*s,.715-.715*u+.715*s,.072+.928*u+.072*s];for(let p=0;p<e.length;p+=4){let f=e[p]+t,h=e[p+1]+t,y=e[p+2]+t;f=(f-.5)*a+.5,h=(h-.5)*a+.5,y=(y-.5)*a+.5;let E=f*vn[0]+h*vn[1]+y*vn[2],v=1+o;if(f=E+(f-E)*v,h=E+(h-E)*v,y=E+(y-E)*v,i){let M=l[0]*f+l[1]*h+l[2]*y,x=l[3]*f+l[4]*h+l[5]*y,S=l[6]*f+l[7]*h+l[8]*y;f=M,h=x,y=S}e[p]=Math.pow(kt(f),c),e[p+1]=Math.pow(kt(h),c),e[p+2]=Math.pow(kt(y),c)}return e}function Zo(e,t){for(let n=3;n<e.length;n+=4)e[n]=e[n]>=t&&e[n]>0?1:0;return e}var kt=e=>e<0?0:e>1?1:e;function Jo(e,t){let n=e.length,o=new Float64Array(n*3),i=new Float64Array(n*3);return e.forEach((r,a)=>{i.set([r[0]/255,r[1]/255,r[2]/255],a*3),o.set(t===1?[r[0]/255,r[1]/255,r[2]/255]:Zn(r[0]/255,r[1]/255,r[2]/255),a*3)}),{n,coords:o,rgb:i,distance:t}}var oo=[.299,.587,.114];function Qo(e,t,n,o){let i,r,a,c=1,u=1,s=1;e.distance===1?(i=t,r=n,a=o,c=oo[0],u=oo[1],s=oo[2]):[i,r,a]=Zn(t,n,o);let l=0,p=1/0,f=e.coords;for(let h=0;h<e.n;h++){let y=i-f[h*3],E=r-f[h*3+1],v=a-f[h*3+2],M=c*y*y+u*E*E+s*v*v;M<p&&(p=M,l=h)}return l}function er(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=o.quantize?Jo(o.palette,o.distance):null,a=o.kind==="ordered"?o.map:null,c=a?o.spread*o.settings.dither.strength:0;for(let u=0;u<n;u++)for(let s=0;s<t;s++){let l=(u*t+s)*4;if(e[l+3]<.5)continue;let p=e[l],f=e[l+1],h=e[l+2];if(r){if(a){let E=(a.values[u%a.h*a.w+s%a.w]+.5)/a.levels-.5;p=kt(p+E*c),f=kt(f+E*c),h=kt(h+E*c)}let y=Qo(r,p,f,h);i[l]=o.palette[y][0],i[l+1]=o.palette[y][1],i[l+2]=o.palette[y][2]}else i[l]=Math.round(p*255),i[l+1]=Math.round(f*255),i[l+2]=Math.round(h*255);i[l+3]=255}return i}function tr(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=Jo(o.palette,o.distance),a=new Float32Array(t*n*3),c=o.settings.dither.strength,u=o.kernel;for(let s=0;s<n;s++)for(let l=0;l<t;l++){let p=s*t+l,f=p*4;if(e[f+3]<.5)continue;let h=kt(e[f]+a[p*3]*c),y=kt(e[f+1]+a[p*3+1]*c),E=kt(e[f+2]+a[p*3+2]*c),v=Qo(r,h,y,E),M=h-r.rgb[v*3],x=y-r.rgb[v*3+1],S=E-r.rgb[v*3+2];for(let[b,_,L]of u){let P=l+b,R=s+_;if(P<0||P>=t||R>=n)continue;let j=(R*t+P)*3;a[j]+=M*L,a[j+1]+=x*L,a[j+2]+=S*L}i[f]=o.palette[v][0],i[f+1]=o.palette[v][1],i[f+2]=o.palette[v][2],i[f+3]=255}return i}var Tn=(e,t)=>e[t+3]===0?-1:e[t]<<16|e[t+1]<<8|e[t+2],nr=[[0,-1],[1,0],[0,1],[-1,0]];function or(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=Tn(o,a),u=[],s=[];for(let[f,h]of nr){let y=r+f,E=i+h;if(y<0||E<0||y>=t||E>=n)continue;let v=(E*t+y)*4;u.push(Tn(o,v)),s.push(v)}if(u.length<2||u.includes(c))continue;let l=0,p=0;for(let f=0;f<u.length;f++){let h=0;for(let y=0;y<u.length;y++)u[y]===u[f]&&h++;h>p&&(p=h,l=f)}e.set(o.subarray(s[l],s[l]+4),a)}return e}function rr(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=Tn(o,a),u=[],s=[];for(let l=-1;l<=1;l++)for(let p=-1;p<=1;p++){let f=Math.min(t-1,Math.max(0,r+p)),y=(Math.min(n-1,Math.max(0,i+l))*t+f)*4;u.push(Tn(o,y)),s.push(y)}for(let l=0;l<9;l++){if(u[l]===c)continue;let p=0;for(let f=0;f<9;f++)u[f]===u[l]&&p++;if(p>=5){e.set(o.subarray(s[l],s[l]+4),a);break}}}return e}function ir(e,t,n,{mode:o,color:i,corners:r}){if(o==="none")return e;let a=e.slice(),c=(l,p)=>l>=0&&p>=0&&l<t&&p<n&&a[(p*t+l)*4+3]>0,u=(l,p)=>l>=0&&p>=0&&l<t&&p<n,s=r?[[0,-1],[1,0],[0,1],[-1,0],[-1,-1],[1,-1],[1,1],[-1,1]]:nr;for(let l=0;l<n;l++)for(let p=0;p<t;p++){let f=c(p,l),h=!1;for(let[y,E]of s){let v=p+y,M=l+E;if(u(v,M)&&(o==="outer"?!f&&c(v,M):f&&!c(v,M))){h=!0;break}}if(h){let y=(l*t+p)*4;e[y]=i[0],e[y+1]=i[1],e[y+2]=i[2],e[y+3]=255}}return e}function ar(e,t){let n=at(e),o=Cn(t.width,t.height,n.frame),{width:i,height:r}=Bo(o.w,o.h,n.size),a=n.palette.colors;n.palette.source==="extract"&&(a=Zi(t,n,i,r,o));let c=n.palette.source!=="none"&&a.length>0,u=c?a.map(wt):[],s=c?Mn(n.dither.method):"none";n.dither.strength<=0&&(s="none");let l=s==="ordered"?Xo(n.dither.method,n.dither.matrix):null,p=s==="diffusion"?qo[n.dither.method]:null,f=p?Yo(p):1;return{settings:n,srcWidth:t.width,srcHeight:t.height,crop:o,width:i,height:r,quantize:c,kind:s,palette:u,paletteHex:c?a.slice():null,distance:n.palette.distance==="rgb"?1:0,spread:c?zo(u):0,map:l,kernel:p,skew:f,waves:p?Ko(i,r,f):0,outline:{mode:n.outline.mode,color:wt(n.outline.color),corners:n.outline.corners}}}function Zi(e,t,n,o,i){let r=Math.min(1,160/Math.max(n,o)),a=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),u=An(e,a,c,"box",i);_n(u,t.adjust);let s=new Uint8ClampedArray(u.length);for(let l=0;l<u.length;l++)s[l]=Math.round(u[l]*255);return Sn({data:s,width:a,height:c},t.palette.count,{alphaThreshold:Math.max(.01,t.alpha.threshold)})}function sr(e,t){let{width:n,height:o,settings:i}=e,r=An(t,n,o,i.size.resample,e.crop);_n(r,i.adjust),Zo(r,i.alpha.threshold);let a=e.kind==="diffusion"?tr(r,n,o,e):er(r,n,o,e);return i.cleanup.orphans&&or(a,n,o),i.cleanup.smooth&&rr(a,n,o),ir(a,n,o,e.outline),a}var Ji="2.0.0",ln=4,cr="glcanvas",Se=class extends Error{constructor(e,t){super(e),this.name="ShaderMateError",t&&Object.assign(this,t)}},lr=new Set;function Ht(e,...t){lr.has(e)||(lr.add(e),console.warn("[ShaderMate]",...t))}var co=typeof window<"u"&&typeof document<"u",Qi=e=>Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView),ur=e=>e==null?[]:Array.isArray(e)?e:[e],dr=e=>e>0&&(e&e-1)===0;function ea(e){var t,n,o,i;if(e==null)return null;if(Array.isArray(e))return[(t=e[0])!=null?t:0,(n=e[1])!=null?n:0,(o=e[2])!=null?o:0,(i=e[3])!=null?i:1];if(typeof e=="string"&&co){let r=document.createElement("canvas");r.width=r.height=1;let a=r.getContext("2d");a.fillStyle=e,a.fillRect(0,0,1,1);let c=a.getImageData(0,0,1,1).data;return[c[0]/255,c[1]/255,c[2]/255,c[3]/255]}return null}function ta(){if(!co)return!1;let e=location.hostname;return location.protocol==="file:"||e==="localhost"||e==="127.0.0.1"||e===""||e.endsWith(".local")}var na=class{constructor(e){this.gl=e,this._items=new Map,this._nextId=1}add(e,t){let n=this._nextId++;return this._items.set(n,{obj:e,count:1,type:t}),n}ref(e){let t=this._items.get(e);return t&&t.count++,e}get(e){let t=this._items.get(e);return t?t.obj:null}unref(e){let t=this._items.get(e);t&&(t.count--,t.count<=0&&this._destroy(e,t))}_destroy(e,t){let{obj:n,type:o}=t,i=this.gl;switch(o){case"texture2D":case"textureCube":i.deleteTexture(n);break;case"fbo":i.deleteFramebuffer(n);break;case"buffer":i.deleteBuffer(n);break;case"program":i.deleteProgram(n);break}this._items.delete(e)}dispose(){for(let[e,t]of[...this._items])this._destroy(e,t)}};function oa(e){let t=new Map;function n(c,u){return t.has(c)||t.set(c,new Set),t.get(c).add(u),()=>o(c,u)}function o(c,u){let s=t.get(c);s&&s.delete(u)}function i(c,u){let s=l=>{o(c,s),u(l)};return n(c,s)}function r(c,u){let s=t.get(c);if(s)for(let l of[...s])try{l(u)}catch(p){console.error(`[ShaderMate] error in "${c}" listener`,p)}e&&e(c,u)}function a(){t.clear()}return{on:n,off:o,once:i,emit:r,clear:a}}var fr={linear:e=>e,inQuad:e=>e*e,outQuad:e=>e*(2-e),inOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,inCubic:e=>e*e*e,outCubic:e=>1-Math.pow(1-e,3),inOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,outExpo:e=>e===1?1:1-Math.pow(2,-10*e),outBack:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),outElastic:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI)/3)+1};function ra(){let e=new Map;function t(i,r,a,c,u={}){let{duration:s=500,delay:l=0}=u,p=typeof u.ease=="function"?u.ease:fr[u.ease]||fr.outCubic,f=e.get(i);f&&f.resolve(!1);let h=r(),y=Array.isArray(c)||ArrayBuffer.isView(c),E=y?Array.from(h??c):Number(h??0),v=y?Array.from(c):Number(c);return new Promise(M=>{let x={start:performance.now()+l,resolve:S=>{e.delete(i),M(S)},update(S){let b=s>0?ia((S-this.start)/s):1;if(b<0)return;let _=p(b);a(y?E.map((L,P)=>L+(v[P]-L)*_):E+(v-E)*_),b>=1&&this.resolve(!0)}};e.set(i,x)})}function n(i){for(let r of[...e.values()])r.update(i)}function o(i){if(i===void 0){for(let a of[...e.values()])a.resolve(!1);return}let r=e.get(i);r&&r.resolve(!1)}return{tween:t,update:n,cancel:o,get size(){return e.size}}}var ia=e=>e<0?e:e>1?1:e;function aa(e){let t;if(typeof e=="string")t=[{src:e}];else if(Array.isArray(e))t=e.map(i=>typeof i=="string"?{src:i}:{...i});else if(e&&typeof e=="object")t=[{...e}];else throw new Se("ShaderMate: expected a shader (string), a pass object, or an array of passes");if(!t.length)throw new Se("ShaderMate: no passes given");t.forEach((i,r)=>{var a,c,u,s,l;if(i.src==null&&(i.src=(s=(u=(c=(a=i.shader)!=null?a:i.frag)!=null?c:i.fragment)!=null?u:i.glsl)!=null?s:i.url),i.src==null)throw new Se(`Pass ${(l=i.name)!=null?l:r} has no shader source (use "shader")`);i.name==null&&(i.name=t.length===1?"main":"pass"+r),i.uniforms==null&&(i.uniforms={})}),t.some(i=>i.screen)||(t[t.length-1].screen=!0),t.filter(i=>i.screen).length>1&&console.warn("[ShaderMate] Multiple screen:true passes; last drawn wins.");let n=t.map(i=>i.name),o=n.filter((i,r)=>n.indexOf(i)!==r);if(o.length)throw new Se("Duplicate pass names: "+[...new Set(o)].join(", "));for(let i of t){let r=Array.isArray(i.channels)?i.channels:i.channels?[i.channels]:[];for(i.channels=r.slice(0,ln).map(a=>Cr(a,n,i.name));i.channels.length<ln;)i.channels.push(null)}return t}var sa=e=>typeof HTMLElement<"u"&&e instanceof HTMLElement,ca=e=>typeof ImageBitmap<"u"&&e instanceof ImageBitmap,la=e=>typeof WebGLTexture<"u"&&e instanceof WebGLTexture;function Cr(e,t=[],n=""){if(e==null||e===!1)return null;if(typeof e=="string")return t.includes(e)?{pass:e}:{url:e};if(sa(e)||ca(e))return{element:e};if(la(e))return{texture:e};let o={...e};return o.pass==null&&o.id!=null&&(o.pass=o.id),o.url==null&&o.image!=null&&(o.url=o.image),o.element==null&&o.canvas!=null&&(o.element=o.canvas),o.pass==null&&o.src!=null&&o.url==null&&o.video==null&&(o.url=o.src),o.pass!=null&&!t.includes(o.pass)&&console.warn(`[ShaderMate] Pass "${n}": channel references unknown pass "${o.pass}"`),o}function ro(e){return/[\r\n]/.test(e)||/^\s*(void|#|precision|uniform|in |out |\/\/|\/\*)/.test(e)||/[{};]/.test(e)}var ua=e=>typeof WebGL2RenderingContext<"u"&&e instanceof WebGL2RenderingContext;function da(e,t={}){let n=Object.assign({alpha:t.alpha!==!1,premultipliedAlpha:t.premultipliedAlpha!==!1,preserveDrawingBuffer:!!t.preserveDrawingBuffer,antialias:!!t.antialias,powerPreference:t.powerPreference||"default"},t.contextAttributes),o=t.webgl===void 0?"auto":String(t.webgl),i=null;if((o==="auto"||o==="2")&&(i=e.getContext("webgl2",n)),!i&&(o==="auto"||o==="1")&&(i=e.getContext("webgl",n)||e.getContext("experimental-webgl",n)),!i)throw new Se("WebGL not supported");return i}function fa(e,t){let n={};return t?(n.EXT_color_buffer_float=e.getExtension("EXT_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear")):(n.OES_texture_float=e.getExtension("OES_texture_float"),n.OES_texture_half_float=e.getExtension("OES_texture_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear"),n.OES_texture_half_float_linear=e.getExtension("OES_texture_half_float_linear"),n.OES_standard_derivatives=e.getExtension("OES_standard_derivatives"),n.WEBGL_color_buffer_float=e.getExtension("WEBGL_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.WEBGL_depth_texture=e.getExtension("WEBGL_depth_texture"),n.EXT_shader_texture_lod=e.getExtension("EXT_shader_texture_lod")),n}function pa(e){let t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),e.STATIC_DRAW),{bind(n){e.bindBuffer(e.ARRAY_BUFFER,t);let o=e.getAttribLocation(n,"a_position");o!==-1&&(e.enableVertexAttribArray(o),e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0))},draw(){e.drawArrays(e.TRIANGLES,0,6)},dispose(){e.deleteBuffer(t)}}}function ha(e,t){var n;let o=t.split(`
10
+ `,pi=(e,t)=>JSON.stringify({name:e||"Palette",colors:t.map(n=>wt(n).slice(1))},null,2)});function Ks(e){let t=String(e||"").trim(),n=/palette-list\/([a-z0-9-]+)/i.exec(t);return(n?n[1]:t).toLowerCase().replace(/\.(json|hex|gpl)$/,"")}async function hi(e,{fetch:t=globalThis.fetch}={}){let n=Ks(e);if(!/^[a-z0-9-]+$/.test(n))throw new Error("That does not look like a Lospec palette slug");let o=await t(`https://lospec.com/palette-list/${n}.json`);if(!o.ok)throw new Error(`Lospec returned ${o.status} for "${n}"`);let i=await o.json(),r=So(i);return{name:i.name||n,author:i.author||"",colors:r.colors,slug:n}}var mi=Ut(()=>{To()});function bi(e){let t=e.error?e.error.code:0,n=new Error(Js[t]||"the video could not be loaded");return n.code=t,e.error&&e.error.message&&(n.detail=e.error.message),n}async function Vt(e,{timeout:t=6e4}={}){if(e.error)throw bi(e);return e.readyState<1&&await gi(e,"loadedmetadata",t),e.readyState<2&&await gi(e,"loadeddata",t).catch(n=>{if(n.code)throw n}),e}async function yi(e){let t=new Uint8Array(await e.arrayBuffer()),n={avc1:"H.264",avc3:"H.264",hvc1:"H.265 (HEVC)",hev1:"H.265 (HEVC)",av01:"AV1",vp09:"VP9",vp08:"VP8",mp4v:"MPEG-4 Part 2",apcn:"ProRes",apch:"ProRes",apcs:"ProRes",apco:"ProRes",ap4h:"ProRes 4444",dvh1:"Dolby Vision",dvhe:"Dolby Vision"};for(let r=0;r+24<t.length;r++)if(t[r]===115&&t[r+1]===116&&t[r+2]===115&&t[r+3]===100){let a=String.fromCharCode(t[r+16],t[r+17],t[r+18],t[r+19]);if(n[a])return n[a]}let o=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.length,1<<20))),i=/V_(VP8|VP9|AV1|MPEG4\/ISO\/AVC|MPEGH\/ISO\/HEVC)/.exec(o);return i?{VP8:"VP8",VP9:"VP9",AV1:"AV1","MPEG4/ISO/AVC":"H.264","MPEGH/ISO/HEVC":"H.265 (HEVC)"}[i[1]]:""}async function xi(e){try{let t=new Uint8Array(await e.slice(0,12).arrayBuffer());if(t[0]===26&&t[1]===69&&t[2]===223&&t[3]===163){let n=new TextDecoder("latin1").decode(await e.slice(0,4194304).arrayBuffer());return/A_(OPUS|VORBIS|AAC|MPEG|AC3|EAC3|FLAC|PCM|DTS|TRUEHD|ALAC)/.test(n)}for(let n=0;n+8<=e.size;){let o=new DataView(await e.slice(n,n+16).arrayBuffer()),i=o.getUint32(0),r=String.fromCharCode(o.getUint8(4),o.getUint8(5),o.getUint8(6),o.getUint8(7));if(i===1?i=Number(o.getBigUint64(8)):i===0&&(i=e.size-n),i<8)return null;if(r==="moov"){let a=new Uint8Array(await e.slice(n,n+i).arrayBuffer());for(let c=4;c+16<=a.length;c++)if(a[c]===104&&a[c+1]===100&&a[c+2]===108&&a[c+3]===114&&a[c+12]===115&&a[c+13]===111&&a[c+14]===117&&a[c+15]===110)return!0;return!1}n+=i}return null}catch{return null}}async function zt(e,t){if(t=Math.max(0,Math.min(t,(e.duration||0)-1e-4)),Math.abs(e.currentTime-t)<1e-6&&e.readyState>=2)return;let n="requestVideoFrameCallback"in e?new Promise(i=>{e.requestVideoFrameCallback(()=>i()),setTimeout(i,500)}):null,o=Zs(e,"seeked");e.currentTime=t,await o,n&&await n}async function Hn(e,t=30){if(!("requestVideoFrameCallback"in e))return t;await Vt(e);let n={t:e.currentTime,muted:e.muted,paused:e.paused},o=[];try{e.muted=!0,await new Promise(a=>{let c=setTimeout(a,1200),l=(s,d)=>{o.push(d.mediaTime),o.length>=12?(clearTimeout(c),a()):e.requestVideoFrameCallback(l)};e.requestVideoFrameCallback(l),e.play().catch(()=>{clearTimeout(c),a()})})}finally{e.pause(),e.muted=n.muted,await zt(e,n.t).catch(()=>{})}let i=[];for(let a=1;a<o.length;a++){let c=o[a]-o[a-1];c>.001&&i.push(c)}if(i.length<3)return t;i.sort((a,c)=>a-c);let r=1/i[Math.floor(i.length/2)];for(let a of[12,15,23.976,24,25,29.97,30,48,50,59.94,60])if(Math.abs(r-a)<.6)return a;return Math.round(r)}function Ao({duration:e,fps:t,start:n=0,end:o=e,maxFrames:i=1/0}){let r=[],a=Math.min(i,Math.max(1,Math.floor((o-n)*t+1e-6)));for(let c=0;c<a;c++)r.push(n+(c+.5)/t);return r}async function ln(e,t){await Vt(e);let n=e.paused;e.pause();let o=Array.isArray(t.times)?t.times.filter(i=>Number.isFinite(i)).slice(0,t.maxFrames??1/0):Ao({duration:e.duration,...t});try{for(let i=0;i<o.length;i++){if(t.signal?.aborted)throw new DOMException("Aborted","AbortError");if(await zt(e,o[i]),t.signal?.aborted)throw new DOMException("Aborted","AbortError");await t.onFrame({index:i,time:o[i],total:o.length})}}finally{n||e.play().catch(()=>{})}return o.length}var Zs,Js,gi,un=Ut(()=>{Zs=(e,t,n=4e3)=>new Promise((o,i)=>{let r=setTimeout(()=>{e.removeEventListener(t,a),i(new Error(`Timed out waiting for "${t}"`))},n),a=()=>{clearTimeout(r),o()};e.addEventListener(t,a,{once:!0})}),Js={1:"loading was aborted",2:"a network error stopped the download",3:"the browser could not decode it",4:"this browser can't play this video's format"};gi=(e,t,n)=>new Promise((o,i)=>{let r=()=>{clearTimeout(l),e.removeEventListener(t,a),e.removeEventListener("error",c)},a=()=>{r(),o()},c=()=>{r(),i(bi(e))},l=setTimeout(()=>{r(),i(new Error(`no response from the video decoder after ${n/1e3} s`))},n);e.addEventListener(t,a,{once:!0}),e.addEventListener("error",c,{once:!0})})});async function ac(e){if(e instanceof ArrayBuffer)return e.slice(0);if(ArrayBuffer.isView(e))return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);if(typeof Blob<"u"&&e instanceof Blob)return e.arrayBuffer();let t=typeof e=="string"?e:e&&(e.currentSrc||e.src);if(!t)throw new TypeError("decodeAudio() takes a File, Blob, ArrayBuffer, URL or <video>/<audio> element");let n=await fetch(t);if(!n.ok)throw new Error(`Couldn't load the audio: ${n.status} ${n.statusText}`);return n.arrayBuffer()}async function Li(e,t={}){if(typeof OfflineAudioContext>"u")return null;let n=t.sampleRate||Uo,o=await ac(e),i;try{i=await new OfflineAudioContext(1,1,n).decodeAudioData(o)}catch{return null}let r=Math.max(0,t.start||0),a=Math.min(i.duration,t.end>r?t.end:i.duration),c=Math.floor((a-r)*n);if(c<1)return null;let l=Math.min(t.channels||2,i.numberOfChannels),s=new OfflineAudioContext(l,c,n),d=s.createBufferSource();d.buffer=i,d.connect(s.destination),d.start(0,r,c/n);let h=await s.startRendering(),f=[];for(let p=0;p<l;p++)f.push(h.getChannelData(p));return{sampleRate:n,numberOfChannels:l,channels:f,duration:c/n}}async function Vn(e,t=Uo,n=2,o=128e3){if(typeof AudioEncoder>"u"||!Io[e])return null;let i=e==="opus"?[48e3]:[...new Set([t,48e3,44100])],r=[...new Set([o,128e3,192e3,16e4,96e3,0])];for(let a of i)for(let c of r){let l={codec:Io[e],sampleRate:a,numberOfChannels:n,...c?{bitrate:c}:{},...e==="aac"?{aac:{format:"aac"}}:{}};if((await AudioEncoder.isConfigSupported(l).catch(()=>({}))).supported)return l}return null}async function Xn(e,t=Uo,n=2){return!!await Vn(e,t,n)}async function sc(e,t){if(e.sampleRate===t)return e;let{numberOfChannels:n,channels:o}=e,i=Math.max(1,Math.round(o[0].length*t/e.sampleRate)),r=new OfflineAudioContext(n,i,t),a=r.createBuffer(n,o[0].length,e.sampleRate);for(let d=0;d<n;d++)a.copyToChannel(o[d],d);let c=r.createBufferSource();c.buffer=a,c.connect(r.destination),c.start();let l=await r.startRendering(),s=[];for(let d=0;d<n;d++)s.push(l.getChannelData(d));return{sampleRate:t,numberOfChannels:n,channels:s,duration:i/t}}async function Fo(e,t){if(typeof AudioEncoder>"u")throw new Error("This browser has no WebCodecs AudioEncoder");let n=t.config||{codec:Io[t.codec],sampleRate:e.sampleRate,numberOfChannels:e.numberOfChannels,bitrate:t.bitrate||128e3,...t.codec==="aac"?{aac:{format:"aac"}}:{}};n.sampleRate!==e.sampleRate&&(e=await sc(e,n.sampleRate));let{sampleRate:o,numberOfChannels:i,channels:r}=e,a=null,c=new AudioEncoder({output:(h,f)=>t.onChunk(h,f),error:h=>{a=h}});c.configure(n);let l=Number.isFinite(t.maxDuration)?Math.floor(t.maxDuration*o):1/0,s=Math.min(r[0].length,l),d=Math.round(o/10);for(let h=0;h<s&&!a;h+=d){let f=Math.min(d,s-h),p=new Float32Array(f*i);for(let M=0;M<i;M++)p.set(r[M].subarray(h,h+f),M*f);let b=new AudioData({format:"f32-planar",sampleRate:o,numberOfFrames:f,numberOfChannels:i,timestamp:Math.round(h*1e6/o),data:p});c.encode(b),b.close(),c.encodeQueueSize>16&&await new Promise(M=>setTimeout(M,0))}if(a||await c.flush().catch(h=>{a=h}),c.state!=="closed"&&c.close(),a)throw a}function Pi(e,t,n=312){let o=new Uint8Array(19);o.set([79,112,117,115,72,101,97,100]);let i=new DataView(o.buffer);return i.setUint8(8,1),i.setUint8(9,e),i.setUint16(10,n,!0),i.setUint32(12,t,!0),i.setInt16(16,0,!0),i.setUint8(18,0),o}function kn(e){if(!e||e.length<19||String.fromCharCode(...e.subarray(0,8))!=="OpusHead")return null;let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{channels:t.getUint8(9),preSkip:t.getUint16(10,!0),sampleRate:t.getUint32(12,!0)}}var Io,Uo,Wn=Ut(()=>{Io={aac:"mp4a.40.2",opus:"opus"},Uo=48e3});function tt(e,t){let n=new Yn;t(n);let o=n.out(),i=new Yn().u32(o.length+8).str(e).out(),r=new Uint8Array(o.length+8);return r.set(i),r.set(o,8),r}function cc(e,t){let n=qn(5,[...e]),o=qn(4,[64,21,0,0,0,...Ii(t),...Ii(t),...n]),i=qn(6,[2]);return Xe("esds",0,0,r=>r.bytes(qn(3,[0,2,0,...o,...i])))}function uc(e){if(!e||e.length<7||e[0]!==1)return!1;let t=5,n=e[t++]&31;if(!n)return!1;for(let i=0;i<n;i++){if(t+2>e.length)return!1;let r=e[t]<<8|e[t+1];if(t+=2,r<4||t+r>e.length)return!1;let a=e.subarray(t,t+r);if((a[0]&31)!==7||i===0&&(a[1]!==e[1]||a[2]!==e[2]||a[3]!==e[3]))return!1;t+=r}if(t>=e.length)return!1;let o=e[t++];if(!o)return!1;for(let i=0;i<o;i++){if(t+2>e.length)return!1;let r=e[t]<<8|e[t+1];if(t+=2,r<1||t+r>e.length||(e[t]&31)!==8)return!1;t+=r}return!0}function dc(e){let t=[],n=new DataView(e.buffer,e.byteOffset,e.byteLength);for(let o=0;o+4<=e.length;){let i=n.getUint32(o);if(o+=4,!i||o+i>e.length)break;t.push(e.subarray(o,o+i)),o+=i}return t}function fc(e){let t=[];for(let a=1;a<e.length;a++)a>=3&&e[a]===3&&e[a-1]===0&&e[a-2]===0||t.push(e[a]);let n=24,o=()=>{let a=t[n>>3]>>7-(n&7)&1;return n++,a},i=()=>{let a=0;for(;n<t.length*8&&!o();)a++;let c=0;for(let l=0;l<a;l++)c=c*2+o();return 2**a-1+c};i();let r=i();return r===3&&o(),{chroma:r,lumaBits:i(),chromaBits:i()}}function pc(e){let t=dc(e),n=t.filter(r=>(r[0]&31)===7),o=t.filter(r=>(r[0]&31)===8);if(!n.length||!o.length||n[0].length<4)return null;let i=[1,n[0][1],n[0][2],n[0][3],255,224|n.length];for(let r of n)i.push(r.length>>8,r.length&255,...r);i.push(o.length);for(let r of o)i.push(r.length>>8,r.length&255,...r);if(lc.has(n[0][1])){let r=fc(n[0]);i.push(252|r.chroma&3,248|r.lumaBits&7,248|r.chromaBits&7,0)}return Uint8Array.from(i)}function Do(e){let t=[];for(let n of e){let o=t[t.length-1];o&&o[1]===n?o[0]++:t.push([1,n])}return t}function zo({width:e,height:t,timescale:n=9e4,audio:o=null}){let i=[],r=[],a=null,c=null;function l(){if(!o||!r.length)return null;let s=o.sampleRate,d=o.numberOfChannels,h=r[0].ts,f=r.map(v=>Math.round((v.ts-h)*s/1e6)),p=Math.round(r[r.length-1].dur*s/1e6)||(o.codec==="aac"?1024:960),b=f.map((v,k)=>k+1<f.length?Math.max(1,f[k+1]-v):p),M;if(o.codec==="aac"){if(!c)throw new Error("The audio encoder gave no AAC decoder configuration (AudioSpecificConfig)");M=tt("mp4a",v=>{v.zeros(6).u16(1).zeros(8).u16(d).u16(16).u16(0).u16(0).u32(s<=65535?s*65536:0),v.bytes(cc(c,o.bitrate||128e3))})}else{let v=kn(c),k=v?v.preSkip:312;M=tt("Opus",x=>{x.zeros(6).u16(1).zeros(8).u16(d).u16(16).u16(0).u16(0).u32(48e3*65536),x.bytes(tt("dOps",w=>w.u8(0).u8(d).u16(k).u32(s).u16(0).u8(0)))})}return{rate:s,durs:b,entry:M,mediaDur:b.reduce((v,k)=>v+k,0)}}return{addChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!a&&(a=Ri(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),i.push({data:h,key:s.type==="key",ts:s.timestamp,dur:s.duration||0})},addSample(s,{key:d,timestamp:h,duration:f}){i.push({data:s,key:!!d,ts:h,dur:f||0})},setDescription(s){a=s},addAudioChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!c&&(c=Ri(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),r.push({data:h,ts:s.timestamp,dur:s.duration||0})},addAudioSample(s,{timestamp:d,duration:h}){r.push({data:s,ts:d,dur:h||0})},setAudioDescription(s){c=s},finish(){if(!i.length)throw new Error("No video frames were encoded");if(!uc(a)){let W=i.find(V=>V.key)||i[0];a=pc(W.data)||a}if(!a)throw new Error("The encoder gave no H.264 decoder configuration (avcC)");let s=W=>Math.round(W*n/1e6),d=i.map(W=>s(W.ts)),h=d.slice().sort((W,V)=>W-V),f=s(i[i.length-1].dur)||(h.length>1?h[h.length-1]-h[h.length-2]:s(33333)),p=h.map((W,V)=>V+1<h.length?h[V+1]-W:f),b=d.map((W,V)=>W-h[V]),M=b.some(W=>W!==0),v=p.reduce((W,V)=>W+V,0),k=Math.round(v*1e3/n),x=Do(p),w=Do(b),y=i.map((W,V)=>W.key?V+1:0).filter(Boolean),A=i.reduce((W,V)=>W+V.data.length,0),_=l(),P=_?Math.round(_.mediaDur*1e3/_.rate):0,I=_?r.reduce((W,V)=>W+V.data.length,0):0,H=Math.max(k,P),T=A+I,O=tt("ftyp",W=>W.str("isom").u32(512).str("isom").str("iso2").str("avc1").str("mp41")),D=()=>tt("dinf",W=>W.bytes(Xe("dref",0,0,V=>{V.u32(1),V.bytes(Xe("url ",0,1,()=>{}))}))),F=W=>Xe("stsc",0,0,V=>V.u32(1).u32(1).u32(W).u32(1)),G=W=>Xe("stsz",0,0,V=>{V.u32(0).u32(W.length);for(let Ce of W)V.u32(Ce.data.length)}),N=W=>Xe("stco",0,0,V=>V.u32(1).u32(W)),ve=W=>tt("moov",V=>{V.bytes(Xe("mvhd",0,0,Ce=>{Ce.u32(0).u32(0).u32(1e3).u32(H).u32(65536).u16(256).zeros(10),Oo.forEach(xe=>Ce.u32(xe)),Ce.zeros(24).u32(_?3:2)})),V.bytes(tt("trak",Ce=>{Ce.bytes(Xe("tkhd",0,3,xe=>{xe.u32(0).u32(0).u32(1).u32(0).u32(k).zeros(8).u16(0).u16(0).u16(0).u16(0),Oo.forEach(z=>xe.u32(z)),xe.u32(e<<16).u32(t<<16)})),Ce.bytes(tt("mdia",xe=>{xe.bytes(Xe("mdhd",0,0,z=>z.u32(0).u32(0).u32(n).u32(v).u16(21956).u16(0))),xe.bytes(Xe("hdlr",0,0,z=>z.u32(0).str("vide").zeros(12).str("VideoHandler").u8(0))),xe.bytes(tt("minf",z=>{z.bytes(Xe("vmhd",0,1,ge=>ge.u16(0).u16(0).u16(0).u16(0))),z.bytes(D()),z.bytes(tt("stbl",ge=>{ge.bytes(Xe("stsd",0,0,be=>{be.u32(1),be.bytes(tt("avc1",pe=>{pe.zeros(6).u16(1).zeros(16).u16(e).u16(t).u32(4718592).u32(4718592).u32(0).u16(1);let Se=$o.encode("image-to-pixel").slice(0,31);pe.u8(Se.length).bytes(Se).zeros(31-Se.length).u16(24).u16(65535),pe.bytes(tt("avcC",Ie=>Ie.bytes(a)))}))})),ge.bytes(Xe("stts",0,0,be=>{be.u32(x.length);for(let[pe,Se]of x)be.u32(pe).u32(Se)})),M&&ge.bytes(Xe("ctts",1,0,be=>{be.u32(w.length);for(let[pe,Se]of w)be.u32(pe).u32(Se>>>0)})),y.length<i.length&&ge.bytes(Xe("stss",0,0,be=>{be.u32(y.length);for(let pe of y)be.u32(pe)})),ge.bytes(F(i.length)),ge.bytes(G(i)),ge.bytes(N(W))}))}))}))})),_&&V.bytes(tt("trak",Ce=>{Ce.bytes(Xe("tkhd",0,3,xe=>{xe.u32(0).u32(0).u32(2).u32(0).u32(P).zeros(8).u16(0).u16(1).u16(256).u16(0),Oo.forEach(z=>xe.u32(z)),xe.u32(0).u32(0)})),Ce.bytes(tt("mdia",xe=>{xe.bytes(Xe("mdhd",0,0,z=>z.u32(0).u32(0).u32(_.rate).u32(_.mediaDur).u16(21956).u16(0))),xe.bytes(Xe("hdlr",0,0,z=>z.u32(0).str("soun").zeros(12).str("SoundHandler").u8(0))),xe.bytes(tt("minf",z=>{z.bytes(Xe("smhd",0,0,ge=>ge.u16(0).u16(0))),z.bytes(D()),z.bytes(tt("stbl",ge=>{ge.bytes(Xe("stsd",0,0,pe=>{pe.u32(1),pe.bytes(_.entry)}));let be=Do(_.durs);ge.bytes(Xe("stts",0,0,pe=>{pe.u32(be.length);for(let[Se,Ie]of be)pe.u32(Se).u32(Ie)})),ge.bytes(F(r.length)),ge.bytes(G(r)),ge.bytes(N(W+A))}))}))}))}))}),ke=ve(0).length,fe=O.length+ke+8;if(fe+T>4294967295)throw new Error("Video is larger than 4 GB");let se=ve(fe),de=new Uint8Array(fe+T);de.set(O,0),de.set(se,O.length),new DataView(de.buffer).setUint32(O.length+se.length,T+8),de.set($o.encode("mdat"),O.length+se.length+4);let me=fe;for(let W of i)de.set(W.data,me),me+=W.data.length;if(_)for(let W of r)de.set(W.data,me),me+=W.data.length;return de}}}var $o,Yn,Xe,Oo,Ri,qn,Ii,lc,Ui=Ut(()=>{Wn();$o=new TextEncoder,Yn=class{constructor(){this.parts=[],this.size=0}u8(t){return this.bytes([t&255])}u16(t){return this.bytes([t>>>8&255,t&255])}u32(t){return this.bytes([t>>>24&255,t>>>16&255,t>>>8&255,t&255])}str(t){return this.bytes($o.encode(t))}bytes(t){let n=t instanceof Uint8Array?t:Uint8Array.from(t);return this.parts.push(n),this.size+=n.length,this}zeros(t){return this.bytes(new Uint8Array(t))}out(){let t=new Uint8Array(this.size),n=0;for(let o of this.parts)t.set(o,n),n+=o.length;return t}};Xe=(e,t,n,o)=>tt(e,i=>{i.u8(t).u8(n>>16).u8(n>>8).u8(n),o(i)}),Oo=[65536,0,0,0,65536,0,0,0,1073741824],Ri=e=>new Uint8Array(e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)),qn=(e,t)=>[e,t.length,...t],Ii=e=>[e>>>24&255,e>>>16&255,e>>>8&255,e&255];lc=new Set([100,110,122,244,44,83,86,118,128,138,139,134,135])});function mc(e){let t=new Uint8Array(8);t[0]=1;let n=e;for(let o=7;o>=1;o--)t[o]=n%256,n=Math.floor(n/256);return t}function Di(e){let t=[];for(let n=e;n>0;n=Math.floor(n/256))t.unshift(n%256);return t}function Kn(e){let t=0;for(let i of e)t+=i.length;let n=new Uint8Array(t),o=0;for(let i of e)n.set(i,o),o+=i.length;return n}function No({width:e,height:t,codec:n="vp9",fps:o=0,audio:i=null}){if(i&&i.codec&&i.codec!=="opus")throw new Error(`WebM audio must be Opus, not ${i.codec}`);let r=[],a=[],c=null,l=null;return{addChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!c&&(c=Oi(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),r.push({data:h,key:s.type==="key",ms:s.timestamp/1e3})},addFrame(s,{key:d,timestamp:h}){r.push({data:s,key:!!d,ms:h/1e3})},addAudioChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!l&&(l=Oi(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),a.push({data:h,ms:s.timestamp/1e3,dms:(s.duration||0)/1e3})},addAudioFrame(s,{timestamp:d,duration:h}){a.push({data:s,ms:d/1e3,dms:(h||0)/1e3})},finish(){if(!r.length)throw new Error("No video frames were encoded");let s=!!(i&&a.length),d=o?1e3/o:r.length>1?(r[r.length-1].ms-r[0].ms)/(r.length-1):33.333,h=r[r.length-1].ms+d;if(s){let F=a[a.length-1];h=Math.max(h,F.ms+(F.dms||20))}let f=at(ee.Info,[Pe(ee.TimestampScale,1e6),Fi(ee.Duration,h),Mn(ee.MuxingApp,"image-to-pixel"),Mn(ee.WritingApp,"image-to-pixel")]),p=[at(ee.TrackEntry,[Pe(ee.TrackNumber,fn),Pe(ee.TrackUID,fn),Pe(ee.TrackType,1),Pe(ee.FlagLacing,0),Mn(ee.CodecID,gc[n]||n),...c?[Wt(ee.CodecPrivate,c)]:[],Pe(ee.DefaultDuration,Math.round(d*1e6)),at(ee.Video,[Pe(ee.PixelWidth,e),Pe(ee.PixelHeight,t)])])];if(s){let F=kn(l)?l:Pi(i.numberOfChannels,i.sampleRate),G=kn(F).preSkip;p.push(at(ee.TrackEntry,[Pe(ee.TrackNumber,Bo),Pe(ee.TrackUID,Bo),Pe(ee.TrackType,2),Pe(ee.FlagLacing,0),Mn(ee.CodecID,"A_OPUS"),Wt(ee.CodecPrivate,F),Pe(ee.CodecDelay,Math.round(G*1e9/48e3)),Pe(ee.SeekPreRoll,8e7),at(ee.Audio,[Fi(ee.SamplingFrequency,i.sampleRate),Pe(ee.Channels,i.numberOfChannels)])]))}let b=at(ee.Tracks,p),M=r.map((F,G)=>({track:fn,data:F.data,key:F.key,ms:F.ms,order:G}));s&&a.forEach((F,G)=>M.push({track:Bo,data:F.data,key:!0,ms:F.ms,order:r.length+G})),s&&M.sort((F,G)=>F.ms-G.ms||F.track-G.track||F.order-G.order);let v=[],k=null;for(let F of M){let G=Math.round(F.ms),N=F.track===fn&&F.key;(!k||N||G-k.start>3e4)&&(k={start:G,key:N,blocks:[]},v.push(k));let ve=new Uint8Array(4);ve[0]=128|F.track,new DataView(ve.buffer).setInt16(1,G-k.start),ve[3]=F.key?128:0,k.blocks.push(Wt(ee.SimpleBlock,Kn([ve,F.data])))}let x=v.map(F=>at(ee.Cluster,[Pe(ee.Timestamp,F.start),...F.blocks])),w=(F,G,N)=>at(ee.SeekHead,[[ee.Info,F],[ee.Tracks,G],[ee.Cues,N]].map(([ve,ke])=>at(ee.Seek,[Wt(ee.SeekID,Uint8Array.from(Di(ve))),Pe(ee.SeekPosition,ke,8)]))),A=w(0,0,0).length,_=A+f.length,P=_+b.length,I=[];v.forEach((F,G)=>{F.key&&I.push(at(ee.CuePoint,[Pe(ee.CueTime,F.start),at(ee.CueTrackPositions,[Pe(ee.CueTrack,fn),Pe(ee.CueClusterPosition,P)])])),P+=x[G].length});let H=at(ee.Cues,I.length?I:[at(ee.CuePoint,[Pe(ee.CueTime,0),at(ee.CueTrackPositions,[Pe(ee.CueTrack,fn),Pe(ee.CueClusterPosition,_+b.length)])])]),T=P,O=at(ee.EBML,[Pe(ee.EBMLVersion,1),Pe(ee.EBMLReadVersion,1),Pe(ee.EBMLMaxIDLength,4),Pe(ee.EBMLMaxSizeLength,8),Mn(ee.DocType,"webm"),Pe(ee.DocTypeVersion,4),Pe(ee.DocTypeReadVersion,2)]),D=at(ee.Segment,[w(A,_,T),f,b,...x,H]);return Kn([O,D])}}}var hc,Wt,Pe,Mn,Fi,at,ee,gc,fn,Bo,Oi,$i=Ut(()=>{Wn();hc=new TextEncoder;Wt=(e,t)=>Kn([Uint8Array.from(Di(e)),mc(t.length),t]),Pe=(e,t,n=0)=>{let o=[];for(let i=t;i>0||o.length===0;i=Math.floor(i/256))o.unshift(i%256);for(;o.length<n;)o.unshift(0);return Wt(e,Uint8Array.from(o))},Mn=(e,t)=>Wt(e,hc.encode(t)),Fi=(e,t)=>{let n=new Uint8Array(8);return new DataView(n.buffer).setFloat64(0,t),Wt(e,n)},at=(e,t)=>Wt(e,Kn(t)),ee={EBML:440786851,EBMLVersion:17030,EBMLReadVersion:17143,EBMLMaxIDLength:17138,EBMLMaxSizeLength:17139,DocType:17026,DocTypeVersion:17031,DocTypeReadVersion:17029,Segment:408125543,SeekHead:290298740,Seek:19899,SeekID:21419,SeekPosition:21420,Info:357149030,TimestampScale:2807729,Duration:17545,MuxingApp:19840,WritingApp:22337,Tracks:374648427,TrackEntry:174,TrackNumber:215,TrackUID:29637,TrackType:131,FlagLacing:156,CodecID:134,CodecPrivate:25506,DefaultDuration:2352003,Video:224,PixelWidth:176,PixelHeight:186,CodecDelay:22186,SeekPreRoll:22203,Audio:225,SamplingFrequency:181,Channels:159,Cluster:524531317,Timestamp:231,SimpleBlock:163,Cues:475249515,CuePoint:187,CueTime:179,CueTrackPositions:183,CueTrack:247,CueClusterPosition:241},gc={vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1"},fn=1,Bo=2,Oi=e=>new Uint8Array(e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength))});var Go={};ca(Go,{audioCodecSupported:()=>Xn,createMp4Muxer:()=>zo,createVideoEncoder:()=>Gi,createWebmMuxer:()=>No,decodeAudio:()=>Li,encodeAudio:()=>Fo,encodeVideo:()=>xc,estimateFps:()=>Hn,findAudioConfig:()=>Vn,forEachFrame:()=>ln,frameTimes:()=>Ao,seekTo:()=>zt,videoReady:()=>Vt,videoSupport:()=>bc});async function bc(e=640,t=480){let n={mp4:!1,webm:!1,webcodecs:typeof VideoEncoder<"u",aac:!1,opus:!1};if(n.webcodecs){for(let o of Bi)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.mp4=!0;break}for(let[o]of Ni)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.webm=!0;break}}return n.aac=await Xn("aac"),n.opus=await Xn("opus"),n}async function yc(e,t,n){let o=e==="mp4"?["aac","opus"]:["opus"];for(let i of o){let r=await Vn(i,t.sampleRate,t.numberOfChannels,n);if(r)return{codec:i,config:r}}return null}async function Gi(e){let t=Math.max(1,Math.round(e.scale||1)),n=zi(e.width*t),o=zi(e.height*t),i=e.fps||30,r=e.bitrate||Math.min(2e7,Math.max(2e6,n*o*i*.15));if(typeof VideoEncoder>"u")throw new Error("This browser has no WebCodecs VideoEncoder. Export a GIF or PNG sequence instead.");let a=null,c=null,l=e.format==="mp4"?Bi.map(y=>[y,"avc"]):Ni;for(let[y,A]of l)if((await VideoEncoder.isConfigSupported({codec:y,width:n,height:o,bitrate:r,framerate:i}).catch(()=>({}))).supported){a=y,c=A;break}if(!a)throw new Error(`No ${e.format.toUpperCase()} encoder available in this browser at ${n}\xD7${o}.`);let s=e.audio&&e.audio.channels&&e.audio.channels.length?e.audio:null,d=s?await yc(e.format,s,e.audioBitrate||128e3):null,h=d?d.codec:null,f=d?{codec:h,sampleRate:d.config.sampleRate,numberOfChannels:d.config.numberOfChannels,bitrate:d.config.bitrate||128e3}:null,p=e.format==="mp4"?zo({width:n,height:o,audio:f}):No({width:n,height:o,codec:c,fps:i,audio:f}),b=null,M=new VideoEncoder({output:(y,A)=>p.addChunk(y,A),error:y=>{b=y}});M.configure({codec:a,width:n,height:o,bitrate:r,framerate:i,latencyMode:"quality",...e.format==="mp4"?{avc:{format:"avc"}}:{}});let v=new OffscreenCanvas(n,o),k=v.getContext("2d"),x=0,w=1e6/i;return{width:n,height:o,codec:a,audioCodec:h,async add(y){if(b)throw b;let A=t>1?jt(y,t):y;k.fillStyle="#000",k.fillRect(0,0,n,o),k.putImageData(new ImageData(new Uint8ClampedArray(A.data),A.width,A.height),0,0);let _=new VideoFrame(v,{timestamp:Math.round(x*w),duration:Math.round(w)});M.encode(_,{keyFrame:x%Math.max(1,Math.round(i*2))===0}),_.close(),x++,M.encodeQueueSize>8&&await new Promise(P=>setTimeout(P,0))},async finish(){if(await M.flush(),b)throw b;return M.close(),h&&x>0&&await Fo(s,{config:d.config,maxDuration:x/i,onChunk:(y,A)=>p.addAudioChunk(y,A)}),new Blob([p.finish()],{type:e.format==="mp4"?"video/mp4":"video/webm"})}}}async function xc(e,t){let n=await Gi({...t,width:e[0].width,height:e[0].height});for(let o of e)await n.add(o);return n.finish()}var Bi,Ni,zi,Ho=Ut(()=>{Ui();$i();Wn();Jt();un();Bi=["avc1.640033","avc1.4d0033","avc1.42003e","avc1.640028","avc1.42001f"],Ni=[["vp09.00.10.08","vp9"],["vp8","vp8"]];zi=e=>e+(e&1)});var pn=[{id:"1-bit-monitor",name:"1-Bit Monitor",author:"",colors:["222323","f0f6f0"]},{id:"apollo",name:"Apollo",author:"AdamCYounis",colors:["172038","253a5e","3c5e8b","4f8fba","73bed3","a4dddb","19332d","25562e","468232","75a743","a8ca58","d0da91","4d2b32","7a4841","ad7757","c09473","d7b594","e7d5b3","341c27","602c2c","884b2b","be772b","de9e41","e8c170","241527","411d31","752438","a53030","cf573c","da863e","1e1d39","402751","7a367b","a23e8c","c65197","df84a5","090a14","10141f","151d28","202e37","394a50","577277","819796","a8b5b2","c7cfcc","ebede9"]},{id:"batpalette",name:"Batpalette",author:"el Rojaz",colors:["000000","7f7f7f","ffffff","681e99","3f48cc","88ff82","bfa621","cc3d18"]},{id:"beached-boogaloo",name:"Beached Boogaloo",author:".tomais",colors:["ff0b20","8f0434","500037","a0ff00","57e71e","0ea717","057833","2cdeef","2483e7","153ab7","0d0a87","ff0b88","a60fff","6409cf","eaef30","ff880b","b75308","802202","000000","231940","514378","ffffff","73a3a7","366770","f7b771","c77650","974c38","873939","601e2c","300c1f"]},{id:"cc-29",name:"CC-29",author:"Alpha6",colors:["f2f0e5","b8b5b9","868188","646365","45444f","3a3858","212123","352b42","43436a","4b80ca","68c2d3","a2dcc7","ede19e","d3a068","b45252","6a536e","4b4158","80493a","a77b5b","e5ceb4","c2d368","8ab060","567b79","4e584a","7b7243","b2b47e","edc8c4","cf8acb","5f556a"]},{id:"cga-16",name:"CGA 16",author:"",colors:["000000","0000aa","00aa00","00aaaa","aa0000","aa00aa","aa5500","aaaaaa","555555","5555ff","55ff55","55ffff","ff5555","ff55ff","ffff55","ffffff"]},{id:"chaotic-neutral",name:"Chaotic neutral",author:"Dodecahedron \u2DFD",colors:["e1d4cb","c19f90","a56457","6d504d","484044","392b29","31312f","d8eef0","97999f","81a4c0","6a7f92","415973","43425a","45334b","4b1f40","671087","955ab9"]},{id:"endesga-32",name:"Endesga 32",author:"ENDESGA",colors:["be4a2f","d77643","ead4aa","e4a672","b86f50","733e39","3e2731","a22633","e43b44","f77622","feae34","fee761","63c74d","3e8948","265c42","193c3e","124e89","0099db","2ce8f5","ffffff","c0cbdc","8b9bb4","5a6988","3a4466","262b44","181425","ff0044","68386c","b55088","f6757a","e8b796","c28569"]},{id:"fantasy-24",name:"Fantasy 24",author:"",colors:["1f240a","39571c","a58c27","efac28","efd8a1","ab5c1c","183f39","ef692f","efb775","a56243","773421","724113","2a1d0d","392a1c","684c3c","927e6a","276468","ef3a0c","45230d","3c9f9c","9b1a0a","36170c","550f0a","300f0a"]},{id:"game-boy-dmg",name:"Game Boy (DMG)",author:"",colors:["0f380f","306230","8bac0f","9bbc0f"]},{id:"grayscale-4",name:"Grayscale 4",author:"",colors:["000000","555555","aaaaaa","ffffff"]},{id:"hidden-library",name:"Hidden Library",author:"Pixel Hoo",colors:["100b2a","2a213a","314743","65856d","adca9a","ecfeca","582d27","974133","d67654","5d3441","a3685b","ffb379","ffe6a9","ffffff"]},{id:"intacto14",name:"Intacto14",author:"Anubi",colors:["221529","4b5561","879ba3","cbf5ef","62b4de","5660d6","5b29a6","d64562","f2735c","edbb8e","ab6375","522152","37ada2","8cde8c"]},{id:"journey",name:"Journey",author:"\u{1F34D}PineappleOnPizza\u{1F34D}",colors:["050914","110524","3b063a","691749","9c3247","d46453","f5a15d","ffcf8e","ff7a7d","ff417d","d61a88","94007a","42004e","220029","100726","25082c","3d1132","73263d","bd4035","ed7b39","ffb84a","fff540","c6d831","77b02a","429058","2c645e","153c4a","052137","0e0421","0c0b42","032769","144491","488bd4","78d7ff","b0fff1","faffff","c7d4e1","928fb8","5b537d","392946","24142c","0e0f2c","132243","1a466b","10908e","28c074","3dff6e","f8ffb8","f0c297","cf968c","8f5765","52294b","0f022e","35003b","64004c","9b0e3e","d41e3c","ed4c40","ff9757","d4662f","9c341a","691b22","450c28","2d002e"]},{id:"lospec500",name:"Lospec500",author:"",colors:["10121c","2c1e31","6b2643","ac2847","ec273f","94493a","de5d3a","e98537","f3a833","4d3533","6e4c30","a26d3f","ce9248","dab163","e8d282","f7f3b7","1e4044","006554","26854c","5ab552","9de64e","008b8b","62a477","a6cb96","d3eed3","3e3b65","3859b3","3388de","36c5f4","6dead6","5e5b8c","8c78a5","b0a7b8","deceed","9a4d76","c878af","cc99ff","fa6e79","ffa2ac","ffd1d5","f6e8e0","ffffff"]},{id:"nyx8",name:"Nyx8",author:"Javier Guerrero",colors:["08141e","0f2a3f","20394f","4e495f","816271","997577","c3a38a","f6d6bd"]},{id:"oil-6",name:"Oil 6",author:"",colors:["fbf5ef","f2d3ab","c69fa5","8b6d9c","494d7e","272744"]},{id:"pico-8",name:"PICO-8",author:"",colors:["000000","1d2b53","7e2553","008751","ab5236","5f574f","c2c3c7","fff1e8","ff004d","ffa300","ffec27","00e436","29adff","83769c","ff77a8","ffccaa"]},{id:"resurrect-64",name:"Resurrect 64",author:"Kerrie Lake",colors:["2e222f","3e3546","625565","966c6c","ab947a","694f62","7f708a","9babb2","c7dcd0","ffffff","6e2727","b33831","ea4f36","f57d4a","ae2334","e83b3b","fb6b1d","f79617","f9c22b","7a3045","9e4539","cd683d","e6904e","fbb954","4c3e24","676633","a2a947","d5e04b","fbff86","165a4c","239063","1ebc73","91db69","cddf6c","313638","374e4a","547e64","92a984","b2ba90","0b5e65","0b8a8f","0eaf9b","30e1b9","8ff8e2","323353","484a77","4d65b4","4d9be6","8fd3ff","45293f","6b3e75","905ea9","a884f3","eaaded","753c54","a24b6f","cf657f","ed8099","831c5d","c32454","f04f78","f68181","fca790","fdcbb0"]},{id:"slso8",name:"SLSO8",author:"Luis Miguel Maldonado",colors:["0d2b45","203c56","544e68","8d697a","d08159","ffaa5e","ffd4a3","ffecd6"]},{id:"sweet-canyon-extended-64",name:"Sweet Canyon Extended 64",author:"Mr Slime",colors:["0f0e11","2d2c33","40404a","51545c","6b7179","7c8389","a8b2b6","d5d5d5","eeebe0","f1dbb1","eec99f","e1a17e","cc9562","ab7b49","9a643a","86482f","783a29","6a3328","541d29","42192c","512240","782349","8b2e5d","a93e89","d062c8","ec94ea","f2bdfc","eaebff","a2fafa","64e7e7","54cfd8","2fb6c3","2c89af","25739d","2a5684","214574","1f2966","101445","3c0d3b","66164c","901f3d","bb3030","dc473c","ec6a45","fb9b41","f0c04c","f4d66e","fffb76","ccf17a","97d948","6fba3b","229443","1d7e45","116548","0c4f3f","0a3639","251746","48246d","69189c","9f20c0","e527d2","ff51cf","ff7ada","ff9edb"]},{id:"sweetie-16",name:"Sweetie 16",author:"",colors:["1a1c2c","5d275d","b13e53","ef7d57","ffcd75","a7f070","38b764","257179","29366f","3b5dc9","41a6f6","73eff7","f4f4f4","94b0c2","566c86","333c57"]},{id:"toxic-haze",name:"Toxic Haze",author:"sillyTheJester",colors:["e5ff00","b8d14a","9ab06e","708763","4c5c52","393e40","242424"]},{id:"vinik24",name:"Vinik24",author:"Vinik",colors:["000000","6f6776","9a9a97","c5ccb8","8b5580","c38890","a593a5","666092","9a4f50","c28d75","7ca1c0","416aa3","8d6268","be955c","68aca9","387080","6e6962","93a167","6eaa78","557064","9d9f7f","7e9e99","5d6872","433455"]}];function io(e){let t=String(e||"").toLowerCase();return pn.find(n=>n.id===t||n.name.toLowerCase()===t)||null}Ot();var Pn=1,Ln=2048,mn=[{id:"none",label:"None",kind:"none"},{id:"bayer2",label:"Bayer 2\xD72",kind:"ordered"},{id:"bayer4",label:"Bayer 4\xD74",kind:"ordered"},{id:"bayer8",label:"Bayer 8\xD78",kind:"ordered"},{id:"bayer16",label:"Bayer 16\xD716",kind:"ordered"},{id:"cluster4",label:"Clustered dot 4\xD74",kind:"ordered"},{id:"cluster8",label:"Clustered dot 8\xD78",kind:"ordered"},{id:"lines",label:"Horizontal lines",kind:"ordered"},{id:"bluenoise",label:"Blue noise",kind:"ordered"},{id:"custom",label:"Custom matrix",kind:"ordered"},{id:"floyd-steinberg",label:"Floyd\u2013Steinberg",kind:"diffusion"},{id:"atkinson",label:"Atkinson",kind:"diffusion"},{id:"sierra-lite",label:"Sierra Lite",kind:"diffusion"},{id:"sierra",label:"Sierra",kind:"diffusion"},{id:"burkes",label:"Burkes",kind:"diffusion"},{id:"jarvis",label:"Jarvis\u2013Judice\u2013Ninke",kind:"diffusion"},{id:"stucki",label:"Stucki",kind:"diffusion"}],Rn=e=>(mn.find(t=>t.id===e)||{kind:"none"}).kind;var la=Object.freeze({version:Pn,size:{mode:"width",width:96,height:0,block:8,resample:"box"},adjust:{brightness:0,contrast:0,saturation:0,hue:0,gamma:1},frame:{aspect:"original",zoom:1,x:.5,y:.5},palette:{source:"builtin",id:"endesga-32",name:"Endesga 32",colors:[],count:16,distance:"oklab"},dither:{method:"bayer4",strength:.6,matrix:null},alpha:{threshold:.5},cleanup:{orphans:!1,smooth:!1},outline:{mode:"none",color:"#000000",corners:!1},export:{size:"scale",scale:4,indexed:!0,grid:!1,gridColor:"#000000"}}),ft=(e,t,n,o)=>{let i=Number(e);return Number.isFinite(i)?Math.min(n,Math.max(t,i)):o},Yt=(e,t,n)=>t.includes(e)?e:n,hn=(e,t)=>typeof e=="boolean"?e:t;function Dt(){return Tt({})}function Tt(e={}){let t=la,n=e||{},o={},i=n.size||{},r=n.adjust||{},a=n.palette||{},c=n.dither||{},l=n.alpha||{},s=n.cleanup||{},d=n.outline||{},h=n.export||{};o.version=Pn,o.size={mode:Yt(i.mode,["width","block"],t.size.mode),width:Math.round(ft(i.width,1,Ln,t.size.width)),height:Math.round(ft(i.height,0,Ln,t.size.height)),block:ft(i.block,1,256,t.size.block),resample:Yt(i.resample,["box","nearest"],t.size.resample)},o.adjust={brightness:ft(r.brightness,-1,1,0),contrast:ft(r.contrast,-1,1,0),saturation:ft(r.saturation,-1,1,0),hue:ft(r.hue,-180,180,0),gamma:ft(r.gamma,.2,5,1)};let f=n.frame||{};o.frame={aspect:Yt(f.aspect,rn.map(M=>M.id),"original"),zoom:ft(f.zoom,1,8,1),x:ft(f.x,0,1,.5),y:ft(f.y,0,1,.5)};let p=Yt(a.source,["builtin","custom","extract","none"],t.palette.source);if(o.palette={source:p,id:typeof a.id=="string"?a.id:p==="builtin"?t.palette.id:"",name:typeof a.name=="string"?a.name:"",colors:[],count:Math.round(ft(a.count,2,256,t.palette.count)),distance:Yt(a.distance,["oklab","rgb"],t.palette.distance)},p==="builtin"){let M=io(o.palette.id)||io(t.palette.id);o.palette.id=M.id,o.palette.name=M.name,o.palette.colors=M.colors.map(v=>"#"+v)}else p==="custom"?(o.palette.colors=(Array.isArray(a.colors)?a.colors:[]).filter(An).map(wt).slice(0,256),o.palette.colors.length||(o.palette.colors=["#000000","#ffffff"]),o.palette.name=o.palette.name||"Custom"):p==="extract"?o.palette.name=`Extracted (${o.palette.count})`:o.palette.name="None";let b=mn.some(M=>M.id===c.method)?c.method:t.dither.method;return o.dither={method:b,strength:ft(c.strength,0,1,t.dither.strength),matrix:ua(c.matrix)},o.alpha={threshold:ft(l.threshold,0,1,t.alpha.threshold)},o.cleanup={orphans:hn(s.orphans,!1),smooth:hn(s.smooth,!1)},o.outline={mode:Yt(d.mode,["none","outer","inner"],"none"),color:An(d.color)?wt(d.color):t.outline.color,corners:hn(d.corners,!1)},o.export={size:Yt(h.size,["scale","source"],"scale"),scale:Math.round(ft(h.scale,1,64,t.export.scale)),indexed:hn(h.indexed,t.export.indexed),grid:hn(h.grid,!1),gridColor:An(h.gridColor)?wt(h.gridColor):t.export.gridColor},o}function ua(e){if(!Array.isArray(e)||!e.length||!Array.isArray(e[0]))return null;let t=Math.min(16,e.length),n=Math.min(16,e[0].length),o=[];for(let i=0;i<t;i++){let r=[];for(let a=0;a<n;a++){let c=Number((e[i]||[])[a]);r.push(Number.isFinite(c)?c:0)}o.push(r)}return o}var rn=[{id:"original",label:"Original",ratio:null},{id:"1:1",label:"1:1",ratio:1},{id:"4:3",label:"4:3",ratio:4/3},{id:"3:4",label:"3:4",ratio:3/4},{id:"3:2",label:"3:2",ratio:3/2},{id:"2:3",label:"2:3",ratio:2/3},{id:"16:9",label:"16:9",ratio:16/9},{id:"9:16",label:"9:16",ratio:9/16}];function In(e,t,n={}){let o=(rn.find(s=>s.id===n.aspect)||rn[0]).ratio||e/t,i=e,r=e/o;r>t&&(r=t,i=t*o);let a=Math.max(1,n.zoom||1);i=Math.max(1,Math.min(e,Math.round(i/a))),r=Math.max(1,Math.min(t,Math.round(r/a)));let c=n.x??.5,l=n.y??.5;return{x:Math.round((e-i)*c),y:Math.round((t-r)*l),w:i,h:r}}function er(e,t,n){let o,i;return n.mode==="block"?(o=Math.max(1,Math.round(e/n.block)),i=Math.max(1,Math.round(t/n.block))):(o=n.width,i=n.height||Math.max(1,Math.round(o*t/e))),{width:Math.min(Ln,o),height:Math.min(Ln,i)}}function da(e,t){let n={};for(let o of Object.keys(e)){if(o==="version")continue;let i=e[o],r=t[o];if(i&&typeof i=="object"&&!Array.isArray(i)){let a={};for(let c of Object.keys(i))JSON.stringify(i[c])!==JSON.stringify(r&&r[c])&&(a[c]=i[c]);Object.keys(a).length&&(n[o]=a)}else JSON.stringify(i)!==JSON.stringify(r)&&(n[o]=i)}return n}var tr={enc(e){let t=new TextEncoder().encode(e),n="";for(let o of t)n+=String.fromCharCode(o);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},dec(e){let t=atob(e.replace(/-/g,"+").replace(/_/g,"/"));return new TextDecoder().decode(Uint8Array.from(t,n=>n.charCodeAt(0)))}};function nr(e){let t=Tt(e),n=da(t,Dt());return n.palette&&(t.palette.source!=="custom"&&(delete n.palette.colors,delete n.palette.name),t.palette.source!=="builtin"&&delete n.palette.id,t.palette.source!=="extract"&&delete n.palette.count),n.palette&&!Object.keys(n.palette).length&&delete n.palette,n}function co(e){return tr.enc(JSON.stringify({v:Pn,...nr(e)}))}function lo(e){let t=String(e),n=/[#&?]s=([A-Za-z0-9_-]+)/.exec(t);n&&(t=n[1]);let o=JSON.parse(tr.dec(t));return delete o.v,Tt(o)}function an(e){return JSON.stringify({$schema:"image-to-pixel/settings",version:Pn,...nr(e)},null,2)}function uo(e){let t=typeof e=="string"?JSON.parse(e):e;return delete t.$schema,Tt(t)}function Ht(e,t){let n=JSON.parse(JSON.stringify(e));for(let o of Object.keys(t||{}))t[o]&&typeof t[o]=="object"&&!Array.isArray(t[o])&&n[o]&&typeof n[o]=="object"?Object.assign(n[o],t[o]):n[o]=t[o];return Tt(n)}Ot();var or="DHos2hHvghjhcwXqwKFF/I5L2ny43U2CNthWL2uZuIRL+h7EVxA0YALtMcH8NbbVUPllGoW/JOwz00rvXqMkVz7EYJ7BTqNbvi6qPIwRXa4kwO9YHI8KwRmt7YvNQV/mNKB2OofloLpEyqZhCYxtF4KtQ8mZ4Ud9uQiHHTy+cdiT8wWJO2/UDP6DUtBm3jLocQ+aLq/9atWZRXgD4R/EEGjRAe6qJdB1khZ7SeCqRPAwzwl3Ll6tGP9rqt+W6hSza0+s3xryLJNAsxbxI7d9zEGHZ9NGeiRZ8WYnsVKkdvOyj1a5RmcKU+gq9ZjOIny/XY7nuPcM1p1VOs4rZkyKMhzoKHpfsMR4Ycudb5BLAZ8e96gF6pW0Ow2904T3NpJOHzLhFoH1ltc9tVoTOWXmAqIjO2ZOinMm3I8PfsMA/Muevj/SmkoB6SHcCzqv+8Vg3k29OGEXyeSHnUARacEG2ofHbZvON70gaYnbdsKujVL+c9qlHLLHRGrvtkLlpVt5CVKID/swjak9VIDoXRUzdJMmfdCKpUttLftb3Jko7mOuR/8rXg12qPwDoUbrDy7HQrYPk+Y09QisHFeZciQ93WT0r2rFVtls9pS7IMqGpu4S2FQO8yvXAK14H7R/T6M3GIAHpuuNQsxVMsghXpp73xqGW8xJfl+chMkv9hXQspEb1TYgoXsTKcEGZKFE31K/PrGabbtdgetUzjnoFcdv0Oq9adNOteITmXLwh7j5PWOg8S5xAbon1Uvha76JSukvwJl+7UPitYZK0Tb6cyoJa4P4Lt5BHZu/GouiYkT6C49XI4k4GmcqgdhBrgxQJtMIv0fXp/uP6RJ2OwOpWwx/a0ECUcsMYjSc63erFI3Mm+kiXwSMqf83cEj1B8KHny61QNig+MeX9KxeHeRqxH+pbpEjgRY6aVCftP2WKu3Iofqx422nkL31FV0f203uXLhD1KzFTnnMCtmzLNt0IOFge+0BcFEQdz0Ewn0unj7eG/RR47NX078uzR9HfthwOR5YLIUU/ylMcspAuIKeADN7D5N2NeEUZJVRfJxbO7RPyxmVwjKr3LpV6qBH/s0AkF0yxgVw8JQMc4nmZL8RT7aL3JzGPV7WiAOi6GcpyG6y2PtXGvCZKb3oIfEOyv2RBaT4R2XlhB6SLG3ZEYhUcum7n3w9oipIrvZWBa0w9J/SCGgY7Kt3G7PgM5EO/ULiUSSlOc9ptFWBOq1pQ4Ibbuc1ciKxDUph+8YZj123Hq0qShD6zWLhgCDWO5zbhV4ic/dJgDNRzvFEYHzDU62KF5h/Yb2LAkP6ywePxeCnvSpbx4PbkfG/oj56sDfJ4Tz2hNlsjSCvDsRSkLpxFkLKlT6nv9yYBYotmxD3Itx4Nbz1COch2nijG2ziXC4XVj3al7MKVDptK9UG50/1CXeiYhXBOORaQZT/agkt8ljmtADoK1tw+bdmxHKrvUZpBdVNa55BrE/pNLqHRaT5cZ3xfhRI75vPGH6WXSWoZpsoStGUVaQDt9F1M6rdyIqkIXtjiNUOJkoV5yHcUzCGpfKRH80uw3IPlF/wJ9YTu4sAzCRt4DBlt/1R4r2L2xeD7LwG8SVw+IAj5RVLe18RSdMx/ky4ocyuhlpAkgbqyxRXt37oWof+KbLQCpdUezncSmKmw4yrH4MCpzcScjLKValrOXqwyjVOnGKz7504+a9smMEVOntkNNSg/cd9YJk82yhFCqcXzFWBPHCryO5oIrD/NlII81rERXXL60yz+z8Q4I7WRw+L1wnChicCvIAe4QlX5ZL0A+MfdA43tiX3dqpn+pbWbkC55Rv0SC4HlsWAD5bedzzSl+cmjmOgBJF5wy1aHZvkW6rrOVPUauhUyj+Lq3AjUJx+wEewbOFNGL4CjMNPLvKOAaBckNuCtFnhMnDKHrWJKQ9erxf2LM9fIO6euP5pvyx5HW/2kkKmK5pn9S/E2bM88liP7xWXg9dZ7jgafKteI9J1K7wOZ/k+GqXuSWX3UKnuftpPunxE5K5OcgE8ghLvQ5q1C8YWdNcFuhd/Rg5ozycK1S1cyTqkKpV10OYKv+pQrvtA0SSdzI5UuymeAthvQ8A1bhLYlwuHNNSVx1KxjsXgTH81rvtLhexV25n6iLueabN6qOsHarjfSaFkP5iBOhaJbqhRdgPnfA7Ugze6HZ0KkPKmOGbF+hVg5yH0MF4EKGTR51iLHaw7b6gsWxtI4DX8RSBRf/ocYAwosv0bbN/HWeYS87cwZEP8rG7sjV3+ySlYgOkkUrR2pUaMbaXZdv2kGJUnwmXgJr4Jyul1AX2TEL+M3LFCyI3yzodP0jCeBrMnmDqD3sKWLFkYSsYuek3asAXNcps82Ci8B98ZP7SEO75xRe4Qlc+BTo81pfVTzmDmbg2cMHWoUzdzBLmM9mY92nHPWR6kEs3kkrEH3aQTa5dDtxvvC4j2VoDEmFLKElvxANOeeD9c/yDdYsUsshqkKT3PXOwB2R7BmuJgH0rAhaZOCI/0bk6CYzH3aIU/u+Qh+lZ/qErGbBzmM2b2JZveibBVL7njBZpysBKKceJBgvi4kyG1SYVm7BNArOp4DO4d48ItsDzfvwyfR88l81d9N47UK+FiMa+bQ7YLftFtNEsdfvlhI6lIyDjtTA6X02kUUHrfbP+jKrNaftY0n81eNXmeYdEAjSbwuHkTqZABza4SarwDk9AQ8nTUlEmqBsCj5cYPkNd28RZfob79XDK8jO0KOJgYPdCN+CWSaBlIspH2EkZ1/6ZXbzneUMIz62VL9JxGd/5TgilZFfAv4F38dStlrDpRvTCT5HsniLAF5UKhyF7Wu1V3EEjICLr8f9okVbvmhhlCy5geifxfdqEhgsYw6BqxNtzApYdoxSCNPxSYSczrCYdm0AJB2BpNzGMlca8qhQbmqdpwm1fdPqUDbNM5qSjAae0I2LIrC9NE4rEJW4jKZ58HSes4sU+feNK28oEcdKH5HqpUumvzpHeX+hbbS/dqkCE2ufQqeR1g8LSADWKY3zKqekhjooO5GI42cdelKE3wkHUf0AP4E+RYNQKn3lQqxUd+8JotP9cQN7ZZgJwZykfwYwJCrIvMlyxDlPrHTROLUyPJ8jvcT/dgw+1EEOWBFNW3YZmDbb0mlHDOXzi5jGHfNhTTi7xb7IfPAO09tS+hfc2U5GcO7FDC3R90NexvzPu1kgVtIZh1A6Milbhqwz5YLvNF3jSjS/C7IYj8F9UIkbNuVwl/JW5Koi3EdFzqDFW0GFHXtzpyCKdTugSvnTwNXjGC6bHKL+VQe/tULaD4iqQKwh5cyYQIQN+fTXOiP/YmxeSm/MevG9pglRXahqwm/HYwfx2i/odo6I7WXSCA2KPhwlUXRYvRqzYMjd0CbyDQaH6r/xbXYrB5DsQv5GSrT3scRjUFk+k2fP5NwDpn00Cd6MaQXivRFD4leEXzwExyGT+qff9hEmy61mLAPOa0R+ooTo9rNpn0KVzqgRHNhgPtmmaL0k1ougmrKJoE748Ru1wEReO8TK32yJzgC44r+ZVk7A2hwSrwlEUhfJtahA2UvtsA7bYcSM2okUa9JFrUMLreWKkVhe9C03HlV3nJTXAn+Kp0DJV7WBhqL7JlqQPRL8l1O95ZhBbjpvMSyC36XjpzpUR93YptAzLycJ7/j0pzEfh34CueXIwTti+nGPSvz4U00iLuMcGoitJU7n1GtIQcUZAAtDfHVm80Tdt0nrYZyyVgyA5W+bHVUxe1OQ3FnSc4yUe9Gss0+WXVRoMtkw1kn1C3YtYAROQRPcYX41naova/ZZz4egbUuoitHUDehfOR4zSevD0jfZfJZH/dXey1ZgSUbfR8qU6SB+vEWuM72RrpiDuSc/xagaMllXI2CGo/J+MZS6+WJf4LZO9WC2tMB655HemRZeYRQNYoqkMahk7psTNTCN0hvHWcHmymT4CycQr0pRu1LcvxYr39rYzrsobQdS/rZj99oji9kc2nNsFb/URvBsZMr++IAPltltOnfBbShr5qPu9WNrj/AsbxJkPNVyrZZpkHd0AQUCnSHk4OWpLGE9e1UM4g5Xgq+IHbJI7LrNwpn3QyX5u8NOMOMf5EmuocoovODd6JRXgZjV/kq3nASYfhUajniMmgYH7Dn/w8p1aKGuJvjEkRtlEXoGkOUzWFXfsKw9xKG4JXwXNdtidiS/sueaxmI5zaOL6gETORBuwWOMEc0TFyDPUz2XAl5AZ5+DKaAfWtZNh06UK38pfiErtGjyOneM/uoiCTyQLid8MHtU8X88xYrWr4SHPI/WSdt3b6aJRZst1DkANIuWXCQqxpv1ktyTycB4kw0ngmqGvQfOZU9jkGY0Db9EyDqTSQ12fjoEB/CessGYXfUyI91lsmoUQB8iKaY77rqIQclNQh6j/do4Ed/VjCo18DTu0/HTOzFGuSsciGDWU32RP3Rx+CM8WQKLlMj9WoAbmOr38N5YS81nc6yhZ4K1reN/VSgQ+TdBPuaLsr3hT5lMqDuJPcXJ3UJ/FSLK7CIp9YbK+X8FkA/GPccsRBYzHoaRnxUsc3E1Wr44lP/50Qy3UJpGHPsilU0kGVf0twPrIxYwz+cQLASYIPb+iWedOK58ErzhO0d0erG5oN9nzOm0S+M4ylZfOVJmcGtdJBhrNN5bwk/UXGia4G5xmozojjH9RTqkOK8zLfo74+FvhQBUAYe19C4p7RMO1aOasiVgv6eNcE4iJ6w0j3nzFfHe9oLYk+mHoLZ+oxdrhf8i0QaZ955SzHHKd4YSKI214yp3S59aLXiSNoEI16vtmK6sCGKFCdbEa1O90Vgs1z6JXCAKXSE+xW2qYbm0zZO47EVfdBuxWZatlUC839Swi2zhvfjVIzB/LAOPfJTARoF0huo+G3FcX+hAqZWbM+D6wpSn37WHHDL4E9813EIKIAd6/RB45P9TqD6rk4lqxsgJNGYSTHbrZJfZtYsCam/pov1xI+Yo4lWqjRb/Ak4FKAz2PbF7hEnQSwz4wIfP9s50UfgzXpYsMEoCVJehTHJ/EBrv+cFu2WYBnYCXPnPH/OuV31esvuOdkaTjCmjWm3+QujNpEohtb4YSNJ360xVbuY2WumzCh7sVfQkPJh5D9Z5nE31Hs+3Syp7UaL0GEeUAuPrikNqm2XffbBAdQYM5RF7HbI8VscO3fGnWcUjc8RLFr7SBSY4B78agquIoigwS2JuwxSrQKFw24xuQ+WsPB0QeVWhEfgBrJBZYRR68ZvH7xUBa1upOKTDfQ5ue9DfuywC4q6aEw5hLdB3VPVEWvLHFzpks5j90wbpPlN4DKF1h/Flvm+IFzLJOOhO3qnWOCKL+dCGb9LJ7FR1HUipGPFPHTRMfWqzBHnJ5d5NbRIl/epQnMmtjmW0lyAI27IBGSmNwdnMaDzcJIPvP0SKtUKsGeY1Xz+jNhshRiZVuIEkSOj5lMBcZJZoW/DBPuD4g==";function fa(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):new Uint8Array(Buffer.from(e,"base64"))}function sn(e){let t=[[0]];for(let n=1;n<e;n*=2){let o=[];for(let i=0;i<n*2;i++)o.push(new Array(n*2));for(let i=0;i<n;i++)for(let r=0;r<n;r++){let a=4*t[i][r];o[i][r]=a,o[i][r+n]=a+2,o[i+n][r]=a+3,o[i+n][r+n]=a+1}t=o}return t}function ir(e){let t=e.length,n=e[0].length,o=[];for(let r=0;r<t;r++)for(let a=0;a<n;a++)o.push({i:r*n+a,v:e[r][a]});o.sort((r,a)=>r.v-a.v||r.i-a.i);let i=new Uint8Array(n*t);return o.forEach((r,a)=>{i[r.i]=a}),i}function pa(e){let t=[];for(let n=0;n<e;n++){let o=[];for(let i=0;i<e;i++){let r=(i+.5)/e*2*Math.PI,a=(n+.5)/e*2*Math.PI;o.push(-(Math.cos(r)+Math.cos(a))+(i*e+n)*1e-9)}t.push(o)}return t}var ha=[[7,13,11,4],[12,16,14,8],[10,15,6,2],[5,9,3,1]],fo=new Map;function ar(e,t=null){if(e==="custom"){let i=t&&t.length?t:sn(4);return{w:i[0].length,h:i.length,levels:i.length*i[0].length,values:ir(i)}}if(fo.has(e))return fo.get(e);let n,o=i=>({w:i[0].length,h:i.length,levels:i.length*i[0].length,values:ir(i)});switch(e){case"bayer2":n=o(sn(2));break;case"bayer4":n=o(sn(4));break;case"bayer8":n=o(sn(8));break;case"bayer16":n=o(sn(16));break;case"cluster4":n=o(ha);break;case"cluster8":n=o(pa(8));break;case"lines":n=o([[0],[2],[1],[3]]);break;case"bluenoise":n={w:64,h:64,levels:256,values:fa(or)};break;default:n=o(sn(4))}return fo.set(e,n),n}function sr(e){let t=String(e).split(/\r?\n|;/).map(o=>o.trim()).filter(o=>o&&!/^\//.test(o)).map(o=>o.replace(/[[\]]/g,"").split(/[\s,]+/).filter(Boolean).map(Number));if(!t.length)throw new Error("Matrix is empty");let n=t[0].length;if(t.some(o=>o.length!==n||o.some(i=>!Number.isFinite(i))))throw new Error("Every row needs the same number of values");if(n>16||t.length>16)throw new Error("Matrices are limited to 16\xD716");return t}var Kt=(e,t)=>t.map(([n,o,i])=>[n,o,i/e]),cr={"floyd-steinberg":Kt(16,[[1,0,7],[-1,1,3],[0,1,5],[1,1,1]]),atkinson:Kt(8,[[1,0,1],[2,0,1],[-1,1,1],[0,1,1],[1,1,1],[0,2,1]]),"sierra-lite":Kt(4,[[1,0,2],[-1,1,1],[0,1,1]]),sierra:Kt(32,[[1,0,5],[2,0,3],[-2,1,2],[-1,1,4],[0,1,5],[1,1,4],[2,1,2],[-1,2,2],[0,2,3],[1,2,2]]),burkes:Kt(32,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2]]),jarvis:Kt(48,[[1,0,7],[2,0,5],[-2,1,3],[-1,1,5],[0,1,7],[1,1,5],[2,1,3],[-2,2,1],[-1,2,3],[0,2,5],[1,2,3],[2,2,1]]),stucki:Kt(42,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2],[-2,2,1],[-1,2,2],[0,2,4],[1,2,2],[2,2,1]])},po=12;function lr(e){let t=1;for(let[n,o]of e)o>0&&(t=Math.max(t,Math.floor(-n/o)+1));return t}var ur=(e,t,n)=>e-1+n*(t-1)+1;Ot();function Un(e,t=16,n={}){let{maxSamples:o=4e4,alphaThreshold:i=.5}=n,r=e.width*e.height,a=Math.max(1,Math.floor(r/o)),c=[];for(let f=0;f<r;f+=a){let p=f*4;e.data[p+3]<i*255||c.push([e.data[p],e.data[p+1],e.data[p+2]])}if(!c.length)return["#000000","#ffffff"].slice(0,Math.max(1,t));let l=[c];for(;l.length<t;){let f=-1,p=-1,b=0;if(l.forEach((k,x)=>{if(!(k.length<2))for(let w=0;w<3;w++){let y=255,A=0;for(let P of k)P[w]<y&&(y=P[w]),P[w]>A&&(A=P[w]);let _=(A-y)*Math.sqrt(k.length);_>p&&(p=_,f=x,b=w)}}),f<0||p<=0)break;let M=l[f].slice().sort((k,x)=>k[b]-x[b]),v=M.length>>1;l.splice(f,1,M.slice(0,v),M.slice(v))}let s=l.map(f=>ma(f));for(let f=0;f<6;f++){let p=s.map(()=>[0,0,0,0]);for(let b of c){let M=0,v=1/0;for(let x=0;x<s.length;x++){let w=b[0]-s[x][0],y=b[1]-s[x][1],A=b[2]-s[x][2],_=w*w+y*y+A*A;_<v&&(v=_,M=x)}let k=p[M];k[0]+=b[0],k[1]+=b[1],k[2]+=b[2],k[3]++}s=s.map((b,M)=>p[M][3]?[p[M][0]/p[M][3],p[M][1]/p[M][3],p[M][2]/p[M][3]]:b)}let d=[...new Set(s.map(f=>qt(f)))],h=f=>{let p=parseInt(f.slice(1),16);return .2126*(p>>16)+.7152*(p>>8&255)+.0722*(p&255)};return d.sort((f,p)=>h(f)-h(p))}function ma(e){let t=0,n=0,o=0;for(let i of e)t+=i[0],n+=i[1],o+=i[2];return[t/e.length,n/e.length,o/e.length]}Ot();function On(e,t,n,o="box",i=null){let r=i?i.x:0,a=i?i.y:0,c=i?i.w:e.width,l=i?i.h:e.height,s=e.data,d=e.width,h=new Float32Array(t*n*4),f=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(c/t))),p=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(l/n))),b=new Int32Array(t*f),M=new Int32Array(n*p);for(let v=0;v<t;v++)for(let k=0;k<f;k++)b[v*f+k]=r+Math.min(c-1,Math.floor((2*(v*f+k)+1)*c/(2*t*f)));for(let v=0;v<n;v++)for(let k=0;k<p;k++)M[v*p+k]=a+Math.min(l-1,Math.floor((2*(v*p+k)+1)*l/(2*n*p)));for(let v=0;v<n;v++)for(let k=0;k<t;k++){let x=0,w=0,y=0,A=0;for(let P=0;P<p;P++){let I=M[v*p+P]*d;for(let H=0;H<f;H++){let T=(I+b[k*f+H])*4,O=s[T+3]/255;x+=s[T]/255*O,w+=s[T+1]/255*O,y+=s[T+2]/255*O,A+=O}}let _=(v*t+k)*4;A>0&&(h[_]=x/A,h[_+1]=w/A,h[_+2]=y/A),h[_+3]=A/(f*p)}return h}function Dn(e,{brightness:t=0,contrast:n=0,saturation:o=0,hue:i=0,gamma:r=1}){if(!t&&!n&&!o&&!i&&r===1)return e;let a=n>=0?1/(1-.99*n):1+n,c=1/r,l=Math.cos(i*Math.PI/180),s=Math.sin(i*Math.PI/180),d=[.213+.787*l-.213*s,.715-.715*l-.715*s,.072-.072*l+.928*s,.213-.213*l+.143*s,.715+.285*l+.14*s,.072-.072*l-.283*s,.213-.213*l-.787*s,.715-.715*l+.715*s,.072+.928*l+.072*s];for(let h=0;h<e.length;h+=4){let f=e[h]+t,p=e[h+1]+t,b=e[h+2]+t;f=(f-.5)*a+.5,p=(p-.5)*a+.5,b=(b-.5)*a+.5;let M=f*_n[0]+p*_n[1]+b*_n[2],v=1+o;if(f=M+(f-M)*v,p=M+(p-M)*v,b=M+(b-M)*v,i){let k=d[0]*f+d[1]*p+d[2]*b,x=d[3]*f+d[4]*p+d[5]*b,w=d[6]*f+d[7]*p+d[8]*b;f=k,p=x,b=w}e[h]=Math.pow($t(f),c),e[h+1]=Math.pow($t(p),c),e[h+2]=Math.pow($t(b),c)}return e}function dr(e,t){for(let n=3;n<e.length;n+=4)e[n]=e[n]>=t&&e[n]>0?1:0;return e}var $t=e=>e<0?0:e>1?1:e;function fr(e,t){let n=e.length,o=new Float64Array(n*3),i=new Float64Array(n*3);return e.forEach((r,a)=>{i.set([r[0]/255,r[1]/255,r[2]/255],a*3),o.set(t===1?[r[0]/255,r[1]/255,r[2]/255]:so(r[0]/255,r[1]/255,r[2]/255),a*3)}),{n,coords:o,rgb:i,distance:t}}var ho=[.299,.587,.114];function pr(e,t,n,o){let i,r,a,c=1,l=1,s=1;e.distance===1?(i=t,r=n,a=o,c=ho[0],l=ho[1],s=ho[2]):[i,r,a]=so(t,n,o);let d=0,h=1/0,f=e.coords;for(let p=0;p<e.n;p++){let b=i-f[p*3],M=r-f[p*3+1],v=a-f[p*3+2],k=c*b*b+l*M*M+s*v*v;k<h&&(h=k,d=p)}return d}function hr(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=o.quantize?fr(o.palette,o.distance):null,a=o.kind==="ordered"?o.map:null,c=a?o.spread*o.settings.dither.strength:0;for(let l=0;l<n;l++)for(let s=0;s<t;s++){let d=(l*t+s)*4;if(e[d+3]<.5)continue;let h=e[d],f=e[d+1],p=e[d+2];if(r){if(a){let M=(a.values[l%a.h*a.w+s%a.w]+.5)/a.levels-.5;h=$t(h+M*c),f=$t(f+M*c),p=$t(p+M*c)}let b=pr(r,h,f,p);i[d]=o.palette[b][0],i[d+1]=o.palette[b][1],i[d+2]=o.palette[b][2]}else i[d]=Math.round(h*255),i[d+1]=Math.round(f*255),i[d+2]=Math.round(p*255);i[d+3]=255}return i}function mr(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=fr(o.palette,o.distance),a=new Float32Array(t*n*3),c=o.settings.dither.strength,l=o.kernel;for(let s=0;s<n;s++)for(let d=0;d<t;d++){let h=s*t+d,f=h*4;if(e[f+3]<.5)continue;let p=$t(e[f]+a[h*3]*c),b=$t(e[f+1]+a[h*3+1]*c),M=$t(e[f+2]+a[h*3+2]*c),v=pr(r,p,b,M),k=p-r.rgb[v*3],x=b-r.rgb[v*3+1],w=M-r.rgb[v*3+2];for(let[y,A,_]of l){let P=d+y,I=s+A;if(P<0||P>=t||I>=n)continue;let H=(I*t+P)*3;a[H]+=k*_,a[H+1]+=x*_,a[H+2]+=w*_}i[f]=o.palette[v][0],i[f+1]=o.palette[v][1],i[f+2]=o.palette[v][2],i[f+3]=255}return i}var Fn=(e,t)=>e[t+3]===0?-1:e[t]<<16|e[t+1]<<8|e[t+2],gr=[[0,-1],[1,0],[0,1],[-1,0]];function br(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=Fn(o,a),l=[],s=[];for(let[f,p]of gr){let b=r+f,M=i+p;if(b<0||M<0||b>=t||M>=n)continue;let v=(M*t+b)*4;l.push(Fn(o,v)),s.push(v)}if(l.length<2||l.includes(c))continue;let d=0,h=0;for(let f=0;f<l.length;f++){let p=0;for(let b=0;b<l.length;b++)l[b]===l[f]&&p++;p>h&&(h=p,d=f)}e.set(o.subarray(s[d],s[d]+4),a)}return e}function yr(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=Fn(o,a),l=[],s=[];for(let d=-1;d<=1;d++)for(let h=-1;h<=1;h++){let f=Math.min(t-1,Math.max(0,r+h)),b=(Math.min(n-1,Math.max(0,i+d))*t+f)*4;l.push(Fn(o,b)),s.push(b)}for(let d=0;d<9;d++){if(l[d]===c)continue;let h=0;for(let f=0;f<9;f++)l[f]===l[d]&&h++;if(h>=5){e.set(o.subarray(s[d],s[d]+4),a);break}}}return e}function xr(e,t,n,{mode:o,color:i,corners:r}){if(o==="none")return e;let a=e.slice(),c=(d,h)=>d>=0&&h>=0&&d<t&&h<n&&a[(h*t+d)*4+3]>0,l=(d,h)=>d>=0&&h>=0&&d<t&&h<n,s=r?[[0,-1],[1,0],[0,1],[-1,0],[-1,-1],[1,-1],[1,1],[-1,1]]:gr;for(let d=0;d<n;d++)for(let h=0;h<t;h++){let f=c(h,d),p=!1;for(let[b,M]of s){let v=h+b,k=d+M;if(l(v,k)&&(o==="outer"?!f&&c(v,k):f&&!c(v,k))){p=!0;break}}if(p){let b=(d*t+h)*4;e[b]=i[0],e[b+1]=i[1],e[b+2]=i[2],e[b+3]=255}}return e}function wr(e,t){let n=Tt(e),o=In(t.width,t.height,n.frame),{width:i,height:r}=er(o.w,o.h,n.size),a=n.palette.colors;n.palette.source==="extract"&&(a=ga(t,n,i,r,o));let c=n.palette.source!=="none"&&a.length>0,l=c?a.map(Ft):[],s=c?Rn(n.dither.method):"none";n.dither.strength<=0&&(s="none");let d=s==="ordered"?ar(n.dither.method,n.dither.matrix):null,h=s==="diffusion"?cr[n.dither.method]:null,f=h?lr(h):1;return{settings:n,srcWidth:t.width,srcHeight:t.height,crop:o,width:i,height:r,quantize:c,kind:s,palette:l,paletteHex:c?a.slice():null,distance:n.palette.distance==="rgb"?1:0,spread:c?Qo(l):0,map:d,kernel:h,skew:f,waves:h?ur(i,r,f):0,outline:{mode:n.outline.mode,color:Ft(n.outline.color),corners:n.outline.corners}}}function ga(e,t,n,o,i){let r=Math.min(1,160/Math.max(n,o)),a=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),l=On(e,a,c,"box",i);Dn(l,t.adjust);let s=new Uint8ClampedArray(l.length);for(let d=0;d<l.length;d++)s[d]=Math.round(l[d]*255);return Un({data:s,width:a,height:c},t.palette.count,{alphaThreshold:Math.max(.01,t.alpha.threshold)})}function vr(e,t){let{width:n,height:o,settings:i}=e,r=On(t,n,o,i.size.resample,e.crop);Dn(r,i.adjust),dr(r,i.alpha.threshold);let a=e.kind==="diffusion"?mr(r,n,o,e):hr(r,n,o,e);return i.cleanup.orphans&&br(a,n,o),i.cleanup.smooth&&yr(a,n,o),xr(a,n,o,e.outline),a}var ba="2.0.0",gn=4,Er="glcanvas",et=class extends Error{constructor(e,t){super(e),this.name="ShaderMateError",t&&Object.assign(this,t)}},kr=new Set;function Zt(e,...t){kr.has(e)||(kr.add(e),console.warn("[ShaderMate]",...t))}var xo=typeof window<"u"&&typeof document<"u",ya=e=>Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView),Mr=e=>e==null?[]:Array.isArray(e)?e:[e],Sr=e=>e>0&&(e&e-1)===0;function xa(e){var t,n,o,i;if(e==null)return null;if(Array.isArray(e))return[(t=e[0])!=null?t:0,(n=e[1])!=null?n:0,(o=e[2])!=null?o:0,(i=e[3])!=null?i:1];if(typeof e=="string"&&xo){let r=document.createElement("canvas");r.width=r.height=1;let a=r.getContext("2d");a.fillStyle=e,a.fillRect(0,0,1,1);let c=a.getImageData(0,0,1,1).data;return[c[0]/255,c[1]/255,c[2]/255,c[3]/255]}return null}function wa(){if(!xo)return!1;let e=location.hostname;return location.protocol==="file:"||e==="localhost"||e==="127.0.0.1"||e===""||e.endsWith(".local")}var va=class{constructor(e){this.gl=e,this._items=new Map,this._nextId=1}add(e,t){let n=this._nextId++;return this._items.set(n,{obj:e,count:1,type:t}),n}ref(e){let t=this._items.get(e);return t&&t.count++,e}get(e){let t=this._items.get(e);return t?t.obj:null}unref(e){let t=this._items.get(e);t&&(t.count--,t.count<=0&&this._destroy(e,t))}_destroy(e,t){let{obj:n,type:o}=t,i=this.gl;switch(o){case"texture2D":case"textureCube":i.deleteTexture(n);break;case"fbo":i.deleteFramebuffer(n);break;case"buffer":i.deleteBuffer(n);break;case"program":i.deleteProgram(n);break}this._items.delete(e)}dispose(){for(let[e,t]of[...this._items])this._destroy(e,t)}};function Ea(e){let t=new Map;function n(c,l){return t.has(c)||t.set(c,new Set),t.get(c).add(l),()=>o(c,l)}function o(c,l){let s=t.get(c);s&&s.delete(l)}function i(c,l){let s=d=>{o(c,s),l(d)};return n(c,s)}function r(c,l){let s=t.get(c);if(s)for(let d of[...s])try{d(l)}catch(h){console.error(`[ShaderMate] error in "${c}" listener`,h)}e&&e(c,l)}function a(){t.clear()}return{on:n,off:o,once:i,emit:r,clear:a}}var Cr={linear:e=>e,inQuad:e=>e*e,outQuad:e=>e*(2-e),inOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,inCubic:e=>e*e*e,outCubic:e=>1-Math.pow(1-e,3),inOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,outExpo:e=>e===1?1:1-Math.pow(2,-10*e),outBack:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),outElastic:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI)/3)+1};function ka(){let e=new Map;function t(i,r,a,c,l={}){let{duration:s=500,delay:d=0}=l,h=typeof l.ease=="function"?l.ease:Cr[l.ease]||Cr.outCubic,f=e.get(i);f&&f.resolve(!1);let p=r(),b=Array.isArray(c)||ArrayBuffer.isView(c),M=b?Array.from(p??c):Number(p??0),v=b?Array.from(c):Number(c);return new Promise(k=>{let x={start:performance.now()+d,resolve:w=>{e.delete(i),k(w)},update(w){let y=s>0?Ma((w-this.start)/s):1;if(y<0)return;let A=h(y);a(b?M.map((_,P)=>_+(v[P]-_)*A):M+(v-M)*A),y>=1&&this.resolve(!0)}};e.set(i,x)})}function n(i){for(let r of[...e.values()])r.update(i)}function o(i){if(i===void 0){for(let a of[...e.values()])a.resolve(!1);return}let r=e.get(i);r&&r.resolve(!1)}return{tween:t,update:n,cancel:o,get size(){return e.size}}}var Ma=e=>e<0?e:e>1?1:e;function Sa(e){let t;if(typeof e=="string")t=[{src:e}];else if(Array.isArray(e))t=e.map(i=>typeof i=="string"?{src:i}:{...i});else if(e&&typeof e=="object")t=[{...e}];else throw new et("ShaderMate: expected a shader (string), a pass object, or an array of passes");if(!t.length)throw new et("ShaderMate: no passes given");t.forEach((i,r)=>{var a,c,l,s,d;if(i.src==null&&(i.src=(s=(l=(c=(a=i.shader)!=null?a:i.frag)!=null?c:i.fragment)!=null?l:i.glsl)!=null?s:i.url),i.src==null)throw new et(`Pass ${(d=i.name)!=null?d:r} has no shader source (use "shader")`);i.name==null&&(i.name=t.length===1?"main":"pass"+r),i.uniforms==null&&(i.uniforms={})}),t.some(i=>i.screen)||(t[t.length-1].screen=!0),t.filter(i=>i.screen).length>1&&console.warn("[ShaderMate] Multiple screen:true passes; last drawn wins.");let n=t.map(i=>i.name),o=n.filter((i,r)=>n.indexOf(i)!==r);if(o.length)throw new et("Duplicate pass names: "+[...new Set(o)].join(", "));for(let i of t){let r=Array.isArray(i.channels)?i.channels:i.channels?[i.channels]:[];for(i.channels=r.slice(0,gn).map(a=>zr(a,n,i.name));i.channels.length<gn;)i.channels.push(null)}return t}var Ca=e=>typeof HTMLElement<"u"&&e instanceof HTMLElement,Ta=e=>typeof ImageBitmap<"u"&&e instanceof ImageBitmap,Aa=e=>typeof WebGLTexture<"u"&&e instanceof WebGLTexture;function zr(e,t=[],n=""){if(e==null||e===!1)return null;if(typeof e=="string")return t.includes(e)?{pass:e}:{url:e};if(Ca(e)||Ta(e))return{element:e};if(Aa(e))return{texture:e};let o={...e};return o.pass==null&&o.id!=null&&(o.pass=o.id),o.url==null&&o.image!=null&&(o.url=o.image),o.element==null&&o.canvas!=null&&(o.element=o.canvas),o.pass==null&&o.src!=null&&o.url==null&&o.video==null&&(o.url=o.src),o.pass!=null&&!t.includes(o.pass)&&console.warn(`[ShaderMate] Pass "${n}": channel references unknown pass "${o.pass}"`),o}function mo(e){return/[\r\n]/.test(e)||/^\s*(void|#|precision|uniform|in |out |\/\/|\/\*)/.test(e)||/[{};]/.test(e)}var _a=e=>typeof WebGL2RenderingContext<"u"&&e instanceof WebGL2RenderingContext;function La(e,t={}){let n=Object.assign({alpha:t.alpha!==!1,premultipliedAlpha:t.premultipliedAlpha!==!1,preserveDrawingBuffer:!!t.preserveDrawingBuffer,antialias:!!t.antialias,powerPreference:t.powerPreference||"default"},t.contextAttributes),o=t.webgl===void 0?"auto":String(t.webgl),i=null;if((o==="auto"||o==="2")&&(i=e.getContext("webgl2",n)),!i&&(o==="auto"||o==="1")&&(i=e.getContext("webgl",n)||e.getContext("experimental-webgl",n)),!i)throw new et("WebGL not supported");return i}function Pa(e,t){let n={};return t?(n.EXT_color_buffer_float=e.getExtension("EXT_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear")):(n.OES_texture_float=e.getExtension("OES_texture_float"),n.OES_texture_half_float=e.getExtension("OES_texture_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear"),n.OES_texture_half_float_linear=e.getExtension("OES_texture_half_float_linear"),n.OES_standard_derivatives=e.getExtension("OES_standard_derivatives"),n.WEBGL_color_buffer_float=e.getExtension("WEBGL_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.WEBGL_depth_texture=e.getExtension("WEBGL_depth_texture"),n.EXT_shader_texture_lod=e.getExtension("EXT_shader_texture_lod")),n}function Ra(e){let t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),e.STATIC_DRAW),{bind(n){e.bindBuffer(e.ARRAY_BUFFER,t);let o=e.getAttribLocation(n,"a_position");o!==-1&&(e.enableVertexAttribArray(o),e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0))},draw(){e.drawArrays(e.TRIANGLES,0,6)},dispose(){e.deleteBuffer(t)}}}function Ia(e,t){var n;let o=t.split(`
11
11
  `),i=o.findIndex(a=>/^\s*#line\s+1\b/.test(a))+1,r=[];for(let a of e.split(`
12
- `)){let c=/ERROR:\s*\d+:(\d+):\s*(.*)/.exec(a);if(!c)continue;let u=parseInt(c[1],10),s=i>0?i+u-1:u-1;r.push({line:u,message:c[2].trim(),source:(n=o[s])!=null?n:"",physical:s})}return r}function pr(e,t,n,{label:o="",showExpandedOnError:i=!0}={}){let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return{shader:r};let a=e.getShaderInfoLog(r)||"";e.deleteShader(r);let c=ha(a,n),u=t===e.VERTEX_SHADER?"Vertex":"Fragment",s=c.length?c.map(p=>`line ${p.line}: ${p.message}`).join(`
13
- `):a.trim(),l=new Se(`${u} shader compile error${o?` in pass "${o}"`:""}:
14
- ${s}`,{pass:o,stage:u,log:a,errors:c,source:n});if(i){let p=new Set(c.map(h=>h.physical)),f=n.split(`
15
- `).map((h,y)=>`${p.has(y)?">>>":" "} ${String(y+1).padStart(4," ")} | ${h}`).join(`
16
- `);console.error("[ShaderMate] "+l.message,{COMPILED:`
17
- `+f})}else console.error("[ShaderMate] "+l.message);return{error:l}}function Sr(e,t,n,o){let i=pr(e,e.VERTEX_SHADER,t,o);if(i.error)return i;let r=pr(e,e.FRAGMENT_SHADER,n,o);if(r.error)return e.deleteShader(i.shader),r;let a=e.createProgram();if(e.attachShader(a,i.shader),e.attachShader(a,r.shader),e.linkProgram(a),e.deleteShader(i.shader),e.deleteShader(r.shader),!e.getProgramParameter(a,e.LINK_STATUS)){let c=e.getProgramInfoLog(a)||"";e.deleteProgram(a);let u=new Se(`Program link error${o&&o.label?` in pass "${o.label}"`:""}: ${c}`,{pass:o&&o.label,log:c});return console.error("[ShaderMate] "+u.message),{error:u}}return{program:a}}function hr(e,t){let n=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),o={};for(let i=0;i<n;i++){let r=e.getActiveUniform(t,i);r&&(o[r.name.replace(/\[0\]$/,"")]={loc:e.getUniformLocation(t,r.name),type:r.type,size:r.size})}return o}var Tr=`#version 300 es
12
+ `)){let c=/ERROR:\s*\d+:(\d+):\s*(.*)/.exec(a);if(!c)continue;let l=parseInt(c[1],10),s=i>0?i+l-1:l-1;r.push({line:l,message:c[2].trim(),source:(n=o[s])!=null?n:"",physical:s})}return r}function Tr(e,t,n,{label:o="",showExpandedOnError:i=!0}={}){let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return{shader:r};let a=e.getShaderInfoLog(r)||"";e.deleteShader(r);let c=Ia(a,n),l=t===e.VERTEX_SHADER?"Vertex":"Fragment",s=c.length?c.map(h=>`line ${h.line}: ${h.message}`).join(`
13
+ `):a.trim(),d=new et(`${l} shader compile error${o?` in pass "${o}"`:""}:
14
+ ${s}`,{pass:o,stage:l,log:a,errors:c,source:n});if(i){let h=new Set(c.map(p=>p.physical)),f=n.split(`
15
+ `).map((p,b)=>`${h.has(b)?">>>":" "} ${String(b+1).padStart(4," ")} | ${p}`).join(`
16
+ `);console.error("[ShaderMate] "+d.message,{COMPILED:`
17
+ `+f})}else console.error("[ShaderMate] "+d.message);return{error:d}}function Br(e,t,n,o){let i=Tr(e,e.VERTEX_SHADER,t,o);if(i.error)return i;let r=Tr(e,e.FRAGMENT_SHADER,n,o);if(r.error)return e.deleteShader(i.shader),r;let a=e.createProgram();if(e.attachShader(a,i.shader),e.attachShader(a,r.shader),e.linkProgram(a),e.deleteShader(i.shader),e.deleteShader(r.shader),!e.getProgramParameter(a,e.LINK_STATUS)){let c=e.getProgramInfoLog(a)||"";e.deleteProgram(a);let l=new et(`Program link error${o&&o.label?` in pass "${o.label}"`:""}: ${c}`,{pass:o&&o.label,log:c});return console.error("[ShaderMate] "+l.message),{error:l}}return{program:a}}function Ar(e,t){let n=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),o={};for(let i=0;i<n;i++){let r=e.getActiveUniform(t,i);r&&(o[r.name.replace(/\[0\]$/,"")]={loc:e.getUniformLocation(t,r.name),type:r.type,size:r.size})}return o}var Nr=`#version 300 es
18
18
  layout(location=0) in vec2 a_position;
19
- void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,Ar=`attribute vec2 a_position;
20
- void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,ma=`#define texture2D(s,u) texture(s,u)
19
+ void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,Gr=`attribute vec2 a_position;
20
+ void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,Ua=`#define texture2D(s,u) texture(s,u)
21
21
  #define textureCube(s,u) texture(s,u)
22
22
  #define TEX(s,u) texture(s,u)
23
23
  #define TEX_LOD(s,u,l) textureLod(s,u,l)
24
- `,ga=`#define texture(s,u) texture2D(s,u)
24
+ `,Fa=`#define texture(s,u) texture2D(s,u)
25
25
  #define TEX(s,u) texture2D(s,u)
26
26
  #define TEX_LOD(s,u,l) texture2D(s,u)
27
- `,ba=`
27
+ `,Oa=`
28
28
  #line 100000
29
29
  void main(){
30
30
  vec4 c = vec4(0.0);
31
31
  mainImage(c, gl_FragCoord.xy);
32
32
  outColor = c;
33
- }`,ya=`
33
+ }`,Da=`
34
34
  #line 100000
35
35
  void main(){
36
36
  vec4 c = vec4(0.0);
37
37
  mainImage(c, gl_FragCoord.xy);
38
38
  gl_FragColor = c;
39
- }`,xa=`#version 300 es
39
+ }`,$a=`#version 300 es
40
40
  precision highp float;
41
41
  uniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;
42
- void main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`,wa=`precision highp float;
42
+ void main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`,za=`precision highp float;
43
43
  uniform sampler2D u_tex; uniform vec2 u_size;
44
- void main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;function va(e,t,n){let o=Sr(e,t?Tr:Ar,t?xa:wa,{label:"blit"});if(o.error)throw o.error;let i=o.program,r=e.getUniformLocation(i,"u_tex"),a=e.getUniformLocation(i,"u_size");return{draw(c,u,s){e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,u,s),e.useProgram(i),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,c),e.uniform1i(r,0),e.uniform2f(a,u,s),n.bind(i),n.draw()},dispose(){e.deleteProgram(i)}}}function lo(e,t){return t==="repeat"?e.REPEAT:t==="mirror"||t==="mirrored"?e.MIRRORED_REPEAT:e.CLAMP_TO_EDGE}function uo(e,t){return t==="nearest"?e.NEAREST:e.LINEAR}function Ea(e,t,n,o){let i=t?e.RGBA8:e.RGBA,r=e.RGBA,a=e.UNSIGNED_BYTE;return o.float==="full"||o.float===32?t?(i=e.RGBA32F,a=e.FLOAT):n.OES_texture_float&&(a=e.FLOAT):o.float&&(t?(i=e.RGBA16F,a=e.HALF_FLOAT):n.OES_texture_half_float?a=n.OES_texture_half_float.HALF_FLOAT_OES:n.OES_texture_float&&(a=e.FLOAT)),{ifmt:i,fmt:r,type:a}}function ka(e,t,n,o){let i=e.createTexture();e.bindTexture(e.TEXTURE_2D,i),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,t,4,4,0,n,o,null);let r=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,r),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,i,0);let a=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteFramebuffer(r),e.deleteTexture(i),a}function mr(e,t,n,o,i,r,a){let c=Ea(e,r,a,i),u=c;ka(e,c.ifmt,c.fmt,c.type)||(Ht("fmt-fallback","Requested float format not renderable on this device; falling back to 8-bit."),u={ifmt:r?e.RGBA8:e.RGBA,fmt:e.RGBA,type:e.UNSIGNED_BYTE});let s=i.filter;u.type!==e.UNSIGNED_BYTE&&s!=="nearest"&&((r?u.type===e.HALF_FLOAT||a.OES_texture_float_linear:u.type===e.FLOAT?a.OES_texture_float_linear:a.OES_texture_half_float_linear)||(s="nearest"));let l=e.createTexture();e.bindTexture(e.TEXTURE_2D,l);let p=lo(e,i.wrap),f=uo(e,s);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,p),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,p),e.texImage2D(e.TEXTURE_2D,0,u.ifmt,n,o,0,u.fmt,u.type,null);let h=null;i.depth&&(!r&&!a.WEBGL_depth_texture?Ht("depth-tex","depth: true needs WebGL2 or WEBGL_depth_texture; ignoring."):(h=e.createTexture(),e.bindTexture(e.TEXTURE_2D,h),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,r?e.DEPTH_COMPONENT16:e.DEPTH_COMPONENT,n,o,0,e.DEPTH_COMPONENT,e.UNSIGNED_SHORT,null)));let y=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,y),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,l,0),h&&e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,h,0);let E=e.checkFramebufferStatus(e.FRAMEBUFFER);return E!==e.FRAMEBUFFER_COMPLETE&&console.warn("[ShaderMate] Framebuffer incomplete:",E),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(l,"texture2D"),depthId:h?t.add(h,"texture2D"):null,fboId:t.add(y,"fbo"),width:n,height:o,fmt:u}}function Pn(e,t){t&&(e.unref(t.texId),t.depthId&&e.unref(t.depthId),e.unref(t.fboId))}function Ma(e,t,n){let o=i=>Math.max(1,Math.round(i));return e==null||e==="screen"||e==="canvas"?[t,n]:e==="half"?[o(t/2),o(n/2)]:e==="quarter"?[o(t/4),o(n/4)]:typeof e=="number"?[o(t*e),o(n*e)]:Array.isArray(e)?[o(e[0]),o(e[1])]:typeof e=="object"&&e.width&&e.height?[o(e.width),o(e.height)]:[t,n]}var Ca={iResolution:"vec3",iTime:"float",iTimeDelta:"float",iFrame:"int",iFrameRate:"float",iMouse:"vec4",iDate:"vec4",iScroll:"vec2",iSampleRate:"float",iChannelTime:"float[4]",iChannelResolution:"vec3[4]",u_resolution:"vec2",u_time:"float",u_delta:"float",u_frame:"int",u_fps:"float",u_mouse:"vec2",u_mouseUV:"vec2",u_mouseDown:"float",u_date:"vec4",u_scroll:"vec2",u_pixelRatio:"float",u_aspect:"float",u_time_delta:"float",u_refresh_rate:"float",u_drag:"vec2",u_wheel:"float"},fo=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,""),Sa=`#define iGlobalTime iTime
45
- `;function Ta(e,t){let n=fo(e);return!/\bfragColor\b/.test(n)||!/\bvoid\s+main\s*\(/.test(n)||/\bout\s+vec4\s+fragColor\b/.test(n)||/#define\s+fragColor\b/.test(n)?"":t?`out vec4 fragColor;
44
+ void main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;function Ba(e,t,n){let o=Br(e,t?Nr:Gr,t?$a:za,{label:"blit"});if(o.error)throw o.error;let i=o.program,r=e.getUniformLocation(i,"u_tex"),a=e.getUniformLocation(i,"u_size");return{draw(c,l,s){e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,l,s),e.useProgram(i),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,c),e.uniform1i(r,0),e.uniform2f(a,l,s),n.bind(i),n.draw()},dispose(){e.deleteProgram(i)}}}function wo(e,t){return t==="repeat"?e.REPEAT:t==="mirror"||t==="mirrored"?e.MIRRORED_REPEAT:e.CLAMP_TO_EDGE}function vo(e,t){return t==="nearest"?e.NEAREST:e.LINEAR}function Na(e,t,n,o){let i=t?e.RGBA8:e.RGBA,r=e.RGBA,a=e.UNSIGNED_BYTE;return o.float==="full"||o.float===32?t?(i=e.RGBA32F,a=e.FLOAT):n.OES_texture_float&&(a=e.FLOAT):o.float&&(t?(i=e.RGBA16F,a=e.HALF_FLOAT):n.OES_texture_half_float?a=n.OES_texture_half_float.HALF_FLOAT_OES:n.OES_texture_float&&(a=e.FLOAT)),{ifmt:i,fmt:r,type:a}}function Ga(e,t,n,o){let i=e.createTexture();e.bindTexture(e.TEXTURE_2D,i),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,t,4,4,0,n,o,null);let r=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,r),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,i,0);let a=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteFramebuffer(r),e.deleteTexture(i),a}function _r(e,t,n,o,i,r,a){let c=Na(e,r,a,i),l=c;Ga(e,c.ifmt,c.fmt,c.type)||(Zt("fmt-fallback","Requested float format not renderable on this device; falling back to 8-bit."),l={ifmt:r?e.RGBA8:e.RGBA,fmt:e.RGBA,type:e.UNSIGNED_BYTE});let s=i.filter;l.type!==e.UNSIGNED_BYTE&&s!=="nearest"&&((r?l.type===e.HALF_FLOAT||a.OES_texture_float_linear:l.type===e.FLOAT?a.OES_texture_float_linear:a.OES_texture_half_float_linear)||(s="nearest"));let d=e.createTexture();e.bindTexture(e.TEXTURE_2D,d);let h=wo(e,i.wrap),f=vo(e,s);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,h),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,h),e.texImage2D(e.TEXTURE_2D,0,l.ifmt,n,o,0,l.fmt,l.type,null);let p=null;i.depth&&(!r&&!a.WEBGL_depth_texture?Zt("depth-tex","depth: true needs WebGL2 or WEBGL_depth_texture; ignoring."):(p=e.createTexture(),e.bindTexture(e.TEXTURE_2D,p),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,r?e.DEPTH_COMPONENT16:e.DEPTH_COMPONENT,n,o,0,e.DEPTH_COMPONENT,e.UNSIGNED_SHORT,null)));let b=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,b),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,d,0),p&&e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,p,0);let M=e.checkFramebufferStatus(e.FRAMEBUFFER);return M!==e.FRAMEBUFFER_COMPLETE&&console.warn("[ShaderMate] Framebuffer incomplete:",M),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(d,"texture2D"),depthId:p?t.add(p,"texture2D"):null,fboId:t.add(b,"fbo"),width:n,height:o,fmt:l}}function $n(e,t){t&&(e.unref(t.texId),t.depthId&&e.unref(t.depthId),e.unref(t.fboId))}function Ha(e,t,n){let o=i=>Math.max(1,Math.round(i));return e==null||e==="screen"||e==="canvas"?[t,n]:e==="half"?[o(t/2),o(n/2)]:e==="quarter"?[o(t/4),o(n/4)]:typeof e=="number"?[o(t*e),o(n*e)]:Array.isArray(e)?[o(e[0]),o(e[1])]:typeof e=="object"&&e.width&&e.height?[o(e.width),o(e.height)]:[t,n]}var ja={iResolution:"vec3",iTime:"float",iTimeDelta:"float",iFrame:"int",iFrameRate:"float",iMouse:"vec4",iDate:"vec4",iScroll:"vec2",iSampleRate:"float",iChannelTime:"float[4]",iChannelResolution:"vec3[4]",u_resolution:"vec2",u_time:"float",u_delta:"float",u_frame:"int",u_fps:"float",u_mouse:"vec2",u_mouseUV:"vec2",u_mouseDown:"float",u_date:"vec4",u_scroll:"vec2",u_pixelRatio:"float",u_aspect:"float",u_time_delta:"float",u_refresh_rate:"float",u_drag:"vec2",u_wheel:"float"},Eo=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,""),Va=`#define iGlobalTime iTime
45
+ `;function Xa(e,t){let n=Eo(e);return!/\bfragColor\b/.test(n)||!/\bvoid\s+main\s*\(/.test(n)||/\bout\s+vec4\s+fragColor\b/.test(n)||/#define\s+fragColor\b/.test(n)?"":t?`out vec4 fragColor;
46
46
  `:`#define fragColor gl_FragColor
47
- `}var Aa={u_camera_pos:"vec3",u_camera_dir:"vec3",u_camera_view:"mat4",u_recursion:"int",u_max_recursion:"int",u_color_gamut:"int"},_a=["u_audio","u_keyboard","u_webcam","u_main"];function Pa(e){let t=fo(e);return/\bfragColor\b/.test(t)&&/\bvoid\s+main\s*\(/.test(t)&&!/\bmainImage\s*\(/.test(t)}function La(e,t=[],n={}){let o=fo(e),i="",r=u=>new RegExp("uniform\\s+(?:\\w+\\s+)*"+u+"\\b").test(o),a=u=>new RegExp("\\b"+u+"\\b").test(o),c=Object.assign({},Ca,n.fragcoord?Aa:null);n.mouseVec4&&(c.u_mouse="vec4"),n.scrollFloat&&(c.u_scroll="float");for(let u in c){if(!a(u)||r(u))continue;let s=c[u],l=/^(\w+)\[(\d+)\]$/.exec(s);i+=l?`uniform ${l[1]} ${u}[${l[2]}];
48
- `:`uniform ${s} ${u};
49
- `}for(let u=0;u<4;u++){let s="iChannel"+u;!a(s)||r(s)||(i+=`uniform ${t[u]==="cube"?"samplerCube":"sampler2D"} ${s};
50
- `)}for(let u of new Set([..._a,...n.samplerNames||[]]))a(u)&&!r(u)&&(i+=`uniform sampler2D ${u};
47
+ `}var Wa={u_camera_pos:"vec3",u_camera_dir:"vec3",u_camera_view:"mat4",u_recursion:"int",u_max_recursion:"int",u_color_gamut:"int"},qa=["u_audio","u_keyboard","u_webcam","u_main"];function Ya(e){let t=Eo(e);return/\bfragColor\b/.test(t)&&/\bvoid\s+main\s*\(/.test(t)&&!/\bmainImage\s*\(/.test(t)}function Ka(e,t=[],n={}){let o=Eo(e),i="",r=l=>new RegExp("uniform\\s+(?:\\w+\\s+)*"+l+"\\b").test(o),a=l=>new RegExp("\\b"+l+"\\b").test(o),c=Object.assign({},ja,n.fragcoord?Wa:null);n.mouseVec4&&(c.u_mouse="vec4"),n.scrollFloat&&(c.u_scroll="float");for(let l in c){if(!a(l)||r(l))continue;let s=c[l],d=/^(\w+)\[(\d+)\]$/.exec(s);i+=d?`uniform ${d[1]} ${l}[${d[2]}];
48
+ `:`uniform ${s} ${l};
49
+ `}for(let l=0;l<4;l++){let s="iChannel"+l;!a(s)||r(s)||(i+=`uniform ${t[l]==="cube"?"samplerCube":"sampler2D"} ${s};
50
+ `)}for(let l of new Set([...qa,...n.samplerNames||[]]))a(l)&&!r(l)&&(i+=`uniform sampler2D ${l};
51
51
  `);return n.passCount>0&&/\bu_passes\b/.test(o)&&!r("u_passes")&&(i+=`uniform sampler2D u_passes[${n.passCount}];
52
- `),i}var gr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");async function Ra(e,{loader:t,throwOnError:n=!1,warn:o=console.warn}={}){let i=new Set,r=[];async function a(c){let u=/^[ \t]*#include\s+["<]([^">]+)[">]/gm,s="",l=0,p;for(;p=u.exec(c);){let f=p[1];if(s+=c.slice(l,p.index),l=u.lastIndex,r.includes(f))o("[ShaderMate] Circular include:",f),s+=`
52
+ `),i}var Lr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");async function Za(e,{loader:t,throwOnError:n=!1,warn:o=console.warn}={}){let i=new Set,r=[];async function a(c){let l=/^[ \t]*#include\s+["<]([^">]+)[">]/gm,s="",d=0,h;for(;h=l.exec(c);){let f=h[1];if(s+=c.slice(d,h.index),d=l.lastIndex,r.includes(f))o("[ShaderMate] Circular include:",f),s+=`
53
53
  // skipped include "${f}" (circular)
54
54
  `;else if(i.has(f))s+=`
55
55
  // skipped include "${f}" (already included)
56
- `;else{i.add(f),r.push(f);try{let h=await t(f),y=await a(h);s+=`
56
+ `;else{i.add(f),r.push(f);try{let p=await t(f),b=await a(p);s+=`
57
57
  // begin include "${f}"
58
- ${y}
58
+ ${b}
59
59
  // end include "${f}"
60
- `}catch(h){if(o(`[ShaderMate] Failed to load include "${f}"`,h),n)throw h;s+=`
60
+ `}catch(p){if(o(`[ShaderMate] Failed to load include "${f}"`,p),n)throw p;s+=`
61
61
  // failed include "${f}"
62
- `}finally{r.pop()}}}return s+c.slice(l)}return a(e)}function Ua(e){let t="";for(let n of e)if(typeof n=="string")t+=`#define ${n}
62
+ `}finally{r.pop()}}}return s+c.slice(d)}return a(e)}function Ja(e){let t="";for(let n of e)if(typeof n=="string")t+=`#define ${n}
63
63
  `;else if(n&&typeof n=="object")for(let o in n){let i=n[o];t+=i===!0||i===void 0?`#define ${o}
64
64
  `:`#define ${o} ${i}
65
- `}return t}var _r={header:!0,builtins:!0,uniforms:!0,defines:!0,mainWrap:!0},Ia={header:!1,builtins:!1,uniforms:!1,defines:!1,mainWrap:!1};function Oa(e,{isGL2:t,defines:n=[],enableDerivatives:o=!1,inject:i=_r,channelTypes:r=[],builtinOpts:a={}}={}){if(!i||!Object.values(i).some(Boolean))return e;let c="",u=e,s=/^[ \t]*#version[^\n]*/m.exec(u);s&&(c=s[0].trim()+`
66
- `,u=u.slice(0,s.index)+u.slice(s.index+s[0].length));let l="";if(c?l+=c:i.header&&t&&(l+=`#version 300 es
67
- `),i.builtins&&!t&&o&&(l+=`#extension GL_OES_standard_derivatives : enable
68
- `),i.header&&(l+=`precision highp float;
65
+ `}return t}var Hr={header:!0,builtins:!0,uniforms:!0,defines:!0,mainWrap:!0},Qa={header:!1,builtins:!1,uniforms:!1,defines:!1,mainWrap:!1};function es(e,{isGL2:t,defines:n=[],enableDerivatives:o=!1,inject:i=Hr,channelTypes:r=[],builtinOpts:a={}}={}){if(!i||!Object.values(i).some(Boolean))return e;let c="",l=e,s=/^[ \t]*#version[^\n]*/m.exec(l);s&&(c=s[0].trim()+`
66
+ `,l=l.slice(0,s.index)+l.slice(s.index+s[0].length));let d="";if(c?d+=c:i.header&&t&&(d+=`#version 300 es
67
+ `),i.builtins&&!t&&o&&(d+=`#extension GL_OES_standard_derivatives : enable
68
+ `),i.header&&(d+=`precision highp float;
69
69
  precision highp int;
70
- `),i.builtins){l+=t?ma:ga,l+=Sa;let y=Ta(u,t),E=/\bout\s+(?:\w+\s+)*vec4\s+\w+\s*;/.test(gr(u));y?l+=y:t&&!E&&(l+=`out vec4 outColor;
71
- `)}i.uniforms&&(l+=La(u,r,a)),i.defines&&(l+=Ua(n));let p=gr(u),f=i.mainWrap&&/\bmainImage\s*\(/.test(p)&&!/\bvoid\s+main\s*\(/.test(p),h=l+`#line 1
72
- `+u;return f&&(h+=t?ba:ya),h}function Rn(e,t,n,o,i,r={},a={},{dynamic:c=!1,flipDefault:u=!1}={}){let s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);let l=r.flipY===void 0?u:!!r.flipY,p=!a.isGL2&&!(dr(o)&&dr(i));p&&r.wrap&&r.wrap!=="clamp"&&Ht("npot-wrap","Non-power-of-two texture in WebGL1: forcing wrap to clamp.");let f=p?e.CLAMP_TO_EDGE:lo(e,r.wrap),h=!!r.mipmap&&!c&&!p,y=uo(e,r.filter),E=h?r.filter==="nearest"?e.NEAREST_MIPMAP_NEAREST:e.LINEAR_MIPMAP_LINEAR:y;e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,E),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,y),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,f);let v=()=>{e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,l),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!!r.premultiplyAlpha),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1)};return v(),h&&e.generateMipmap(e.TEXTURE_2D),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(s,"texture2D"),width:o,height:i,source:n,update:c?()=>{n.readyState!==void 0&&n.readyState<2||(e.bindTexture(e.TEXTURE_2D,s),v(),e.bindTexture(e.TEXTURE_2D,null))}:()=>{}}}function Da(e,t,n,o={},i={}){return new Promise((r,a)=>{let c=new Image;c.crossOrigin=o.crossOrigin===void 0?"anonymous":o.crossOrigin,c.onload=()=>r(Rn(e,t,c,c.naturalWidth,c.naturalHeight,o,i)),c.onerror=()=>a(new Error(`Failed to load image "${n}"`)),c.src=n})}var Fa=["+X","-X","+Y","-Y","+Z","-Z"];function $a(e,t,n,o={}){return new Promise((i,r)=>{if(!Array.isArray(n)||n.length!==6)return r(new Error("cubemap needs an array of 6 URLs"));let a=e.createTexture();e.bindTexture(e.TEXTURE_CUBE_MAP,a);let c=lo(e,o.wrap),u=uo(e,o.filter);e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MIN_FILTER,u),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MAG_FILTER,u),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_S,c),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_T,c);let s=[e.TEXTURE_CUBE_MAP_POSITIVE_X,e.TEXTURE_CUBE_MAP_NEGATIVE_X,e.TEXTURE_CUBE_MAP_POSITIVE_Y,e.TEXTURE_CUBE_MAP_NEGATIVE_Y,e.TEXTURE_CUBE_MAP_POSITIVE_Z,e.TEXTURE_CUBE_MAP_NEGATIVE_Z],l=0,p=0,f=0,h=!1;n.forEach((y,E)=>{let v=new Image;v.crossOrigin="anonymous",v.onload=()=>{h||(p||(p=v.width,f=v.height),e.bindTexture(e.TEXTURE_CUBE_MAP,a),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.texImage2D(s[E],0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,v),++l===6&&(o.mipmap&&e.generateMipmap(e.TEXTURE_CUBE_MAP),e.bindTexture(e.TEXTURE_CUBE_MAP,null),i({texId:t.add(a,"textureCube"),width:p,height:f,cubemap:!0,update(){}})))},v.onerror=()=>{h||(h=!0,e.deleteTexture(a),r(new Error(`Failed to load cubemap face ${Fa[E]}: "${y}"`)))},v.src=y})})}function za(e){let t=e.play&&e.play();t&&t.catch&&t.catch(()=>{let n=()=>{e.play().catch(()=>{})};window.addEventListener("pointerdown",n,{once:!0}),window.addEventListener("keydown",n,{once:!0})})}function Ba(e,t,n,o={},i={}){return new Promise((r,a)=>{let c=document.createElement("video");Object.assign(c,{src:n,crossOrigin:"anonymous",loop:o.loop!==!1,muted:o.muted!==!1,playsInline:!0,autoplay:!0}),c.addEventListener("error",()=>a(new Error(`Failed to load video "${n}"`)),{once:!0}),c.addEventListener("canplay",()=>{za(c);let u=Rn(e,t,c,c.videoWidth,c.videoHeight,{...o,flipY:o.flipY===void 0?!0:o.flipY},i,{dynamic:!0});u.getTime=()=>c.currentTime,u.media=c,u.dispose=()=>{c.pause(),c.removeAttribute("src"),c.load()},r(u)},{once:!0}),c.load()})}function Na(e,t,n={},o={}){let i=typeof n.camera=="object"?n.camera:{facingMode:"user"};return navigator.mediaDevices.getUserMedia({video:i,audio:!1}).then(r=>new Promise(a=>{let c=document.createElement("video");Object.assign(c,{srcObject:r,muted:!0,playsInline:!0,autoplay:!0}),c.addEventListener("loadedmetadata",()=>{c.play().catch(()=>{});let u=Rn(e,t,c,c.videoWidth,c.videoHeight,{...n,flipY:n.flipY===void 0?!0:n.flipY},o,{dynamic:!0});u.media=c,u.dispose=()=>{c.pause(),r.getTracks().forEach(s=>s.stop())},a(u)},{once:!0})}))}function br(e,t,n,{mic:o=!1}={}){let i=n.layout==="spectrogram",r=n.fftSize||(i?1024:512),a=window.AudioContext||window.webkitAudioContext;return new Promise((c,u)=>{var s;let l=new a,p=l.createAnalyser();p.fftSize=r,p.smoothingTimeConstant=(s=n.smoothing)!=null?s:.8;let f=p.frequencyBinCount,h=new Uint8Array(r),y=i?f:2,E=i?3:1,v=new Uint8Array(f*y*E),M=i?new Uint8Array(f):null,x=null;i&&(x=l.createAnalyser(),x.fftSize=r,x.smoothingTimeConstant=0);let S=e.createTexture(),b=i?e.RGB:e.LUMINANCE,_=()=>{e.bindTexture(e.TEXTURE_2D,S),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,b,f,y,0,b,e.UNSIGNED_BYTE,v),e.bindTexture(e.TEXTURE_2D,null)};e.bindTexture(e.TEXTURE_2D,S),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),_();let L=()=>l.currentTime,P=()=>{},R=()=>{let I=()=>{l.state==="suspended"&&l.resume()};I(),window.addEventListener("pointerdown",I,{once:!0}),window.addEventListener("keydown",I,{once:!0}),c({texId:t.add(S,"texture2D"),width:f,height:y,analyser:p,context:l,getTime:L,update(){if(i){let N=f*3;v.copyWithin(N,0,v.length-N),p.getByteFrequencyData(M),p.getByteTimeDomainData(h);for(let z=0;z<f;z++)v[z*3]=M[z],v[z*3+1]=h[z*2];x.getByteFrequencyData(M);for(let z=0;z<f;z++)v[z*3+2]=M[z]}else p.getByteFrequencyData(v.subarray(0,f)),p.getByteTimeDomainData(h),v.set(h.subarray(0,f),f);_()},dispose(){P(),l.close&&l.close()}})};if(o){navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(I=>{let N=l.createMediaStreamSource(I);N.connect(p),x&&N.connect(x),P=()=>I.getTracks().forEach(z=>z.stop()),R()}).catch(u);return}let j=n.audio||n.audioFFT,C=j instanceof HTMLMediaElement?j:new Audio,D=C!==j;D&&Object.assign(C,{src:j,crossOrigin:"anonymous",loop:n.loop!==!1,autoplay:!0}),L=()=>C.currentTime;let F=()=>{let I=l.createMediaElementSource(C);if(I.connect(p),x&&I.connect(x),p.connect(l.destination),D){let N=()=>{l.state==="suspended"&&l.resume(),C.play().catch(()=>{})};N(),window.addEventListener("pointerdown",N,{once:!0}),window.addEventListener("keydown",N,{once:!0}),P=()=>{C.pause(),C.removeAttribute("src"),C.load()}}R()};C.readyState>=3?F():(C.addEventListener("canplay",F,{once:!0}),C.addEventListener("error",()=>u(new Error(`Failed to load audio "${j}"`)),{once:!0}),D&&C.load())})}var Ga=e=>typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement,yr=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement;function ja(e,t,n,o={},i={}){let r=n.videoWidth||n.naturalWidth||n.width||1,a=n.videoHeight||n.naturalHeight||n.height||1,c=Ga(n)||yr(n),u=o.dynamic===void 0?c:!!o.dynamic,s=Rn(e,t,n,r,a,o,i,{dynamic:u,flipDefault:c});if(yr(n)&&(s.getTime=()=>n.currentTime),u){let l=s.update;s.update=()=>{s.width=n.videoWidth||n.naturalWidth||n.width||1,s.height=n.videoHeight||n.naturalHeight||n.height||1,l()}}return Promise.resolve(s)}function Ha(e,t,n){let o=t.add(n.texture,n.cube?"textureCube":"texture2D");return t.ref(o),Promise.resolve({texId:o,width:n.width||1,height:n.height||1,cubemap:!!n.cube,update(){}})}function Va(e,t,n={}){let r=new Uint8Array(768),a=new Uint8Array(256),c=new Uint8Array(256),u=new Uint8Array(256),s=n.keyboard&&typeof n.keyboard=="object"&&n.keyboard.target||window,l=v=>{if(typeof v.keyCode=="number"&&v.keyCode)return v.keyCode&255;let M=v.key||"";return M.length===1?M.toUpperCase().charCodeAt(0)&255:0},p=v=>{let M=l(v);a[M]||(c[M]=255,u[M]=u[M]?0:255),a[M]=255},f=v=>{a[l(v)]=0},h=()=>a.fill(0);s.addEventListener("keydown",p),s.addEventListener("keyup",f),window.addEventListener("blur",h);let y=e.createTexture();e.bindTexture(e.TEXTURE_2D,y),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);let E=()=>{e.bindTexture(e.TEXTURE_2D,y),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,256,3,0,e.LUMINANCE,e.UNSIGNED_BYTE,r),e.bindTexture(e.TEXTURE_2D,null)};return E(),Promise.resolve({texId:t.add(y,"texture2D"),width:256,height:3,keyboard:!0,update(){r.set(a,0),r.set(c,256),r.set(u,256*2),E(),c.fill(0)},dispose(){s.removeEventListener("keydown",p),s.removeEventListener("keyup",f),window.removeEventListener("blur",h)}})}function io(e,t,n,o){return n.texture?Ha(e,t,n):n.element?ja(e,t,n.element,n,o):n.url?Da(e,t,n.url,n,o):n.video?Ba(e,t,n.video,n,o):n.camera?Na(e,t,n,o):n.mic?br(e,t,n,{mic:!0}):n.keyboard?Va(e,t,n):n.audio||n.audioFFT?br(e,t,n):n.cubemap?$a(e,t,n.cubemap,n):Promise.reject(new Error("Unrecognised channel: "+JSON.stringify(n)))}function Xa(e){return e?e.cubemap||e.texture&&e.cube?"cube":"2D":null}var Pr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");function Wa(e){let t=/^[ \t]*\/\/[ \t]*(?:=+[ \t]*)?(?:Pass[ \t]*:?[ \t]*([^\n=—–-]+?)|(Main)|(Common))[ \t]*(?:[—–-]+[^\n]*)?(?:=+)?[ \t]*$/gim,n=[],o;for(;o=t.exec(e);)n.push({index:o.index,end:o.index+o[0].length,raw:o[0],pass:o[1],main:!!o[2],common:!!o[3]});if(!n.length)return null;let i={common:e.slice(0,n[0].index).trim(),passes:[]};return n.forEach((r,a)=>{let c=e.slice(r.end,a+1<n.length?n[a+1].index:e.length).trim();if(r.common){i.common=(i.common?i.common+`
73
- `:"")+c;return}let u=r.main?"main":String(r.pass).trim(),s=/buffer\s*type\s*:\s*(\w+)/i.exec(r.raw),l=/^(\d+)$/.exec(u);i.passes.push({name:r.main?"main":l?"pass"+l[1]:u.replace(/[^\w]+/g,"_").replace(/^_+|_+$/g,"").toLowerCase(),label:u,main:r.main,src:c,bufferType:s?s[1].toLowerCase():"2d"})}),i.common&&/[{};]/.test(Pr(i.common)),i}function qa(e){let t={},n=/\[([^\]]*)\]/.exec(e||"");if(!n)return t;for(let o of n[1].toLowerCase().split(/[\s,]+/))o==="nearest"||o==="linear"?t.filter=o:o==="clamp"||o==="repeat"||o==="mirror"?t.wrap=o:o==="mipmap"?t.mipmap=!0:(o==="flipy"||o==="flip")&&(t.flipY=!0);return t}function xr(e){let t={},n={},o=e.split(`
74
- `),i=/^\s*uniform\s+(?:(?:lowp|mediump|highp)\s+)?(\w+)\s+(\w+)(?:\s*\[\s*\d+\s*\])?\s*(?:=\s*([^;]+))?;\s*(?:\/\/(.*))?$/;return{source:o.map(a=>{var c,u,s;let l=i.exec(a);if(!l)return a;let[,p,f,h,y=""]=l,E=y.trim();if(/^sampler/.test(p)){let M=Ya(f,E,p);M&&(n[f]=M)}else{let M={},x=R=>(R.match(/-?\d*\.?\d+(?:e-?\d+)?/g)||[]).map(Number),S=/\[([^\]]*)\]/.exec(E),b=x(E.replace(/\[[^\]]*\]/,"")),_=/vec(\d)/.test(p)?+p.match(/vec(\d)/)[1]:1,L=/^bool/.test(p),P;if(h){let R=x(h);P=_===1?L?/true/.test(h):(c=R[0])!=null?c:0:R.slice(0,_)}else b.length&&(P=_===1?b[0]:b.length>=_?b.slice(0,_):new Array(_).fill(b[0]));if(S){let R=x(S[1]);R.length>=2&&(M.min=R[0],M.max=R[1],R.length>=3&&(M.step=R[2]))}(P!==void 0||S)&&(M.value=P!==void 0?P:_===1?(u=M.min)!=null?u:0:new Array(_).fill((s=M.min)!=null?s:0),t[f]=M)}return h?a.replace(/\s*=\s*[^;]+;/,";"):a}).join(`
75
- `),uniforms:t,samplers:n}}function Ya(e,t,n){let o=qa(t),i=t.replace(/\[[^\]]*\]/g,"").trim(),r=/^ref:\s*(.+)$/i.exec(i);if(r){let a=r[1].trim(),c;return(c=/^pass\s*(\d+)(?::out(\d+))?$/i.exec(a))?{pass:"pass"+c[1],...o}:(c=/^pass:\s*(\S+)/i.exec(a))?{pass:c[1],...o}:/^main$/i.test(a)?{pass:"main",...o}:(c=/^sampler\s+(\w+)/i.exec(a))?{sameAs:c[1],...o}:null}if(e==="u_audio"||/audio/i.test(e)&&/^(mic|\[CAM\]|\[VIDEO\])?$/i.test(i))return/^https?:|^data:/i.test(i)?{audio:i,layout:"spectrogram"}:{mic:!0,layout:"spectrogram"};if(e==="u_webcam")return{camera:!0,...o};if(e==="u_keyboard")return{keyboard:!0};if(/^(https?:|data:)/i.test(i)){let a=i.split(/\s+/)[0];return/\.(mp4|webm|mov|ogv|m4v)(\?|$)/i.test(a)?{video:a,...o}:/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(a)?{audio:a,layout:"spectrogram"}:n==="samplerCube"?null:{url:a,...o}}return null}function Ka(e){return/\bu_mouse\s*\.\s*[xyzw]*[zw]/.test(Pr(e))}var Za=35678,Ja=35680,Qa=e=>e.filter(t=>!t.cfg.screen);function es(e,t,n={}){let o=[],i=Qa(t),r=t.find(u=>u.cfg.screen),a=new Map(t.map(u=>[u.name,u])),c=Object.assign({},e.cfg.annotatedSamplers,e.cfg.samplers);for(let u in e.uniformInfo){let s=e.uniformInfo[u];if(s.type!==Za&&s.type!==Ja||/^iChannel\d$/.test(u))continue;let l=n[u]||c[u]||null,p;if(l&&l.sameAs&&(l=c[l.sameAs]||n[l.sameAs]||null),l||(u==="u_passes"&&s.size>1?l={array:i.slice(0,s.size)}:u==="u_main"?l=r?{pass:r.name}:null:(p=/^u_pass(\d+)$/.exec(u))&&i[+p[1]-1]?l={pass:i[+p[1]-1].name}:u.startsWith("u_")&&a.has(u.slice(2))?l={pass:u.slice(2)}:u==="u_audio"?l={mic:!0,layout:"spectrogram"}:u==="u_keyboard"?l={keyboard:!0}:u==="u_webcam"&&(l={camera:!0})),l&&l.pass!=null&&!a.has(l.pass)){let f=/^pass(\d+)$/.exec(l.pass);f&&i[+f[1]-1]?l={...l,pass:i[+f[1]-1].name}:l.pass==="main"&&r&&(l={...l,pass:r.name})}l&&o.push({name:u,info:s,spec:l})}return o}function ts(e){let t=e.find(n=>n.cfg.screen);return t?e.some(n=>(n.samplers||[]).some(o=>o.spec.pass===t.name)||n.cfg.channels.some(o=>o&&o.pass===t.name)):!1}function ns(e,{target:t=window,speed:n=1.5,sensitivity:o=.004}={}){let i=[0,0,0],r=-Math.PI/2,a=0,c=new Set,u=!1,s=0,l=0,p=[0,0,-1],f=new Float32Array(16),h=(L,P)=>{let R=L.key.length===1?L.key.toLowerCase():L.key;P?c.add(R):c.delete(R)},y=L=>h(L,!0),E=L=>h(L,!1),v=L=>{L.button===0&&(u=!0,s=L.clientX,l=L.clientY)},M=L=>{u&&(r+=(L.clientX-s)*o,a-=(L.clientY-l)*o,a=Math.max(-1.55,Math.min(1.55,a)),s=L.clientX,l=L.clientY)},x=()=>{u=!1},S=L=>{let P=p,R=-L.deltaY*.002*n;i[0]+=P[0]*R,i[1]+=P[1]*R,i[2]+=P[2]*R},b=()=>c.clear();t.addEventListener("keydown",y),t.addEventListener("keyup",E),e.addEventListener("pointerdown",v),window.addEventListener("pointermove",M),window.addEventListener("pointerup",x),e.addEventListener("wheel",S,{passive:!0}),window.addEventListener("blur",b);function _(){let L=p,P=[0,1,0],R=[L[1]*P[2]-L[2]*P[1],L[2]*P[0]-L[0]*P[2],L[0]*P[1]-L[1]*P[0]],j=Math.hypot(R[0],R[1],R[2])||1;R=R.map(D=>D/j);let C=[R[1]*L[2]-R[2]*L[1],R[2]*L[0]-R[0]*L[2],R[0]*L[1]-R[1]*L[0]];return f.set([R[0],C[0],-L[0],0,R[1],C[1],-L[1],0,R[2],C[2],-L[2],0,-(R[0]*i[0]+R[1]*i[1]+R[2]*i[2]),-(C[0]*i[0]+C[1]*i[1]+C[2]*i[2]),L[0]*i[0]+L[1]*i[1]+L[2]*i[2],1]),{right:R,up:C}}return{pos:i,dir:p,view:f,update(L){p[0]=Math.cos(a)*Math.cos(r),p[1]=Math.sin(a),p[2]=Math.cos(a)*Math.sin(r);let{right:P}=_(),R=n*L*(c.has("Shift")?3:1),j=(C,D)=>{i[0]+=C[0]*D,i[1]+=C[1]*D,i[2]+=C[2]*D};(c.has("w")||c.has("ArrowUp"))&&j(p,R),(c.has("s")||c.has("ArrowDown"))&&j(p,-R),(c.has("d")||c.has("ArrowRight"))&&j(P,R),(c.has("a")||c.has("ArrowLeft"))&&j(P,-R),(c.has("e")||c.has(" "))&&(i[1]+=R),(c.has("q")||c.has("c"))&&(i[1]-=R),_()},dispose(){t.removeEventListener("keydown",y),t.removeEventListener("keyup",E),e.removeEventListener("pointerdown",v),window.removeEventListener("pointermove",M),window.removeEventListener("pointerup",x),e.removeEventListener("wheel",S),window.removeEventListener("blur",b)}}}var Lr=Object.create(null),Ie=(e,...t)=>t.forEach(n=>{Lr[n.toLowerCase()]=e});Ie({kind:"f",n:1},"float","number","f","1f","1fv","float[]","uniform1f","uniform1fv");Ie({kind:"f",n:2},"vec2","2f","2fv","vec2[]","uniform2f","uniform2fv");Ie({kind:"f",n:3},"vec3","3f","3fv","vec3[]","uniform3f","uniform3fv");Ie({kind:"f",n:4},"vec4","4f","4fv","vec4[]","uniform4f","uniform4fv");Ie({kind:"i",n:1},"int","bool","boolean","i","1i","1iv","int[]","bool[]","uniform1i","uniform1iv");Ie({kind:"i",n:2},"ivec2","bvec2","2i","2iv","ivec2[]","bvec2[]","uniform2i","uniform2iv");Ie({kind:"i",n:3},"ivec3","bvec3","3i","3iv","ivec3[]","bvec3[]","uniform3i","uniform3iv");Ie({kind:"i",n:4},"ivec4","bvec4","4i","4iv","ivec4[]","bvec4[]","uniform4i","uniform4iv");Ie({kind:"u",n:1},"uint","1ui","1uiv","uint[]");Ie({kind:"u",n:2},"uvec2","2ui","2uiv","uvec2[]");Ie({kind:"u",n:3},"uvec3","3ui","3uiv","uvec3[]");Ie({kind:"u",n:4},"uvec4","4ui","4uiv","uvec4[]");Ie({kind:"m",n:2},"mat2","matrix2fv","mat2fv","uniformmatrix2fv");Ie({kind:"m",n:3},"mat3","matrix3fv","mat3fv","uniformmatrix3fv");Ie({kind:"m",n:4},"mat4","matrix4fv","mat4fv","uniformmatrix4fv");function os(e){return typeof e!="string"?null:Lr[e.trim().toLowerCase()]||null}var rs={5126:{kind:"f",n:1},35664:{kind:"f",n:2},35665:{kind:"f",n:3},35666:{kind:"f",n:4},5124:{kind:"i",n:1},35667:{kind:"i",n:2},35668:{kind:"i",n:3},35669:{kind:"i",n:4},35670:{kind:"i",n:1},35671:{kind:"i",n:2},35672:{kind:"i",n:3},35673:{kind:"i",n:4},5125:{kind:"u",n:1},36294:{kind:"u",n:2},36295:{kind:"u",n:3},36296:{kind:"u",n:4},35674:{kind:"m",n:2},35675:{kind:"m",n:3},35676:{kind:"m",n:4}};function is(e){return rs[e]}var as=5126,wr=35666;function po(e){return e!=null&&typeof e=="object"&&!Qi(e)&&"value"in e}var vr=e=>typeof e=="boolean"?e?1:0:e;function ao(e,t){return typeof e=="number"||typeof e=="boolean"?new Array(t).fill(vr(e)):ArrayBuffer.isView(e)?e:Array.isArray(e)&&e.some(n=>typeof n=="boolean")?e.map(vr):e}function ss(e,t,n,o,i){let r=n.n;switch(n.kind){case"f":return r===1&&typeof o=="number"?e.uniform1f(t,o):e["uniform"+r+"fv"](t,ao(o,r));case"i":return r===1&&(typeof o=="number"||typeof o=="boolean")?e.uniform1i(t,+o):e["uniform"+r+"iv"](t,ao(o,r));case"u":return r===1&&typeof o=="number"?e.uniform1ui(t,o):e["uniform"+r+"uiv"](t,ao(o,r));case"m":return e["uniformMatrix"+r+"fv"](t,!!i,o)}}function Er(e,t,n,{strict:o=!1,warnMissing:i=!1,label:r=""}={}){if(n)for(let a in n){let c=n[a],u=po(c)?c:null,s=u?u.value:c;if(s==null)continue;let l=t[a];if(!l||!l.loc){if(o)throw new Se("Unknown uniform: "+a);i&&Ht("missing-uniform:"+r+":"+a,`Uniform "${a}" not found in ${r?`pass "${r}"`:"shader"} (misspelled, undeclared, or optimized out).`);continue}let p;if(u&&u.type!=null){if(p=os(u.type),!p){if(o)throw new Se("Unknown uniform type: "+u.type+" for "+a);Ht("bad-type:"+a,"Unknown uniform type",u.type,a);continue}}else if(p=is(l.type),!p)continue;ss(e,l.loc,p,s,u&&u.transpose)}}function cs(e,t,n={}){let o=n.target==="canvas"?e:n.target&&typeof n.target=="object"?n.target:window,i=+n.smooth||0,r={x:0,y:0,down:!1,over:!1,dragX:0,dragY:0,wheel:0},a={x:0,y:0,clickX:0,clickY:0,down:!1,over:!1,uvX:0,uvY:0,dragX:0,dragY:0,wheel:0,clicked:!1},c=!1,u=0,s=0,l=!1;function p(){let S=e.getBoundingClientRect(),b=t?t():"fill";if(!S.width||!S.height||b!=="contain"&&b!=="cover")return S;let _=e.width/e.height,L=S.width/S.height,P,R;return L>_==(b==="contain")?(R=S.height,P=R*_):(P=S.width,R=P/_),{left:S.left+(S.width-P)/2,top:S.top+(S.height-R)/2,width:P,height:R,bottom:0,right:0}}function f(S,b){let _=p();return!_.width||!_.height?[0,0]:[(S-_.left)*(e.width/_.width),(_.top+_.height-b)*(e.height/_.height)]}let h=(S,b)=>{let[_,L]=f(S,b);return[_/e.width,L/e.height]},y=S=>{let[b,_]=f(S.clientX,S.clientY);r.down&&(r.dragX+=b-u,r.dragY+=_-s),u=b,s=_,r.x=b,r.y=_,r.over=b>=0&&_>=0&&b<=e.width&&_<=e.height,l||(l=!0,a.x=b,a.y=_)},E=S=>{S.button!==void 0&&S.button!==0||(y(S),!(o===window&&!r.over)&&(r.down=!0,a.down=!0,c=!0,u=r.x,s=r.y,a.clickX=r.x,a.clickY=r.y,i||(a.x=r.x,a.y=r.y)))},v=()=>{r.down=!1,a.down=!1},M=()=>{r.over=!1},x=S=>{r.wheel+=-S.deltaY*.002};return n.touch!==!1&&o===e&&(e.style.touchAction="none"),o.addEventListener("pointermove",y,{passive:!0}),o.addEventListener("pointerdown",E,{passive:!0}),window.addEventListener("pointerup",v,{passive:!0}),window.addEventListener("pointercancel",v,{passive:!0}),o.addEventListener("pointerleave",M,{passive:!0}),o.addEventListener("wheel",x,{passive:!0}),{state:a,toShader:f,toUV:h,update(){if(i>0&&i<1){let S=1-Math.pow(1-i,1);a.x+=(r.x-a.x)*S,a.y+=(r.y-a.y)*S}else a.x=r.x,a.y=r.y;a.over=r.over,a.clicked=c,c=!1,a.dragX=r.dragX,a.dragY=r.dragY,a.wheel=r.wheel,a.uvX=e.width?a.x/e.width:0,a.uvY=e.height?a.y/e.height:0},dispose(){o.removeEventListener("pointermove",y),o.removeEventListener("pointerdown",E),window.removeEventListener("pointerup",v),window.removeEventListener("pointercancel",v),o.removeEventListener("pointerleave",M),o.removeEventListener("wheel",x)}}}function ls(e){if(!e)return 0;if(typeof e=="number")return e;if(Array.isArray(e))return e[0]/e[1];if(typeof e=="string"){let t=e.split(/[:/x]/).map(Number);return t.length===2&&t[1]?t[0]/t[1]:Number(e)||0}return 0}function us(e={},t=!0){var n,o,i,r,a,c;let u=(n=e.size)!=null?n:e.sizing,s={mode:t?"canvas":"window",width:0,height:0,aspect:ls(e.aspect),fit:e.fit||"contain",pixelRatio:(i=(o=e.pixelRatio)!=null?o:e.dpr)!=null?i:"auto",maxPixelRatio:(r=e.maxPixelRatio)!=null?r:2,scale:(c=(a=e.scale)!=null?a:e.renderScale)!=null?c:1};return Array.isArray(u)?(s.mode="fixed",s.width=u[0],s.height=u[1]):typeof u=="string"?s.mode=u==="screen"||u==="fullscreen"?"window":u==="element"?"canvas":u:u&&typeof u=="object"&&(s.mode="fixed",s.width=u.width,s.height=u.height,u.fit&&(s.fit=u.fit)),s.mode==="fixed"&&(s.aspect=s.width/s.height),s}function ds(e,t={},n=!0){let o=us(t,n),i=()=>o.pixelRatio==="auto"?Math.min(window.devicePixelRatio||1,o.maxPixelRatio):Number(o.pixelRatio)||1,r=!1;function a(){return o.mode==="window"?{w:window.innerWidth,h:window.innerHeight}:{w:e.clientWidth||window.innerWidth,h:e.clientHeight||window.innerHeight}}function c(){if(o.mode==="fixed")return{w:o.width,h:o.height};let s=a(),l=i()*o.scale,p=s.w,f=s.h;return o.aspect&&(p/f>o.aspect?p=f*o.aspect:f=p/o.aspect),{w:p*l,h:f*l}}function u(){r||(r=!0,o.mode==="window"&&(e.style.cssText+=";display:block;position:fixed;left:0;top:0;width:100%;height:100%;"),(o.mode==="fixed"||o.aspect)&&(e.style.objectFit=o.fit))}return{cfg:o,fit:()=>o.mode==="fixed"||o.aspect?o.fit:"fill",setFixed(s,l){o.mode="fixed",o.width=s,o.height=l,o.aspect=s/l,r=!1},update(){u();let s=c(),l=Math.max(1,Math.round(s.w)),p=Math.max(1,Math.round(s.h));return e.width===l&&e.height===p?!1:(e.width=l,e.height=p,!0)},observe(s){let l=!1,p=()=>{l||(l=!0,requestAnimationFrame(()=>{l=!1,s()}))};window.addEventListener("resize",p);let f=null;return o.mode==="canvas"&&typeof ResizeObserver<"u"&&(f=new ResizeObserver(p),f.observe(e)),()=>{window.removeEventListener("resize",p),f&&f.disconnect()}}}}function fs(e,{enabled:t=!0,margin:n="100px",onChange:o}={}){let i=typeof document>"u"?!0:!document.hidden,r=!0,a=()=>o&&o(i&&r),c=()=>{i=!document.hidden,a()},u=null;return t&&(document.addEventListener("visibilitychange",c),typeof IntersectionObserver<"u"&&(u=new IntersectionObserver(s=>{for(let l of s)r=l.isIntersecting;a()},{rootMargin:n}),u.observe(e))),{get visible(){return i&&r},dispose(){t&&document.removeEventListener("visibilitychange",c),u&&u.disconnect()}}}var ps={font:'"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',mono:'"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace',bg:"#1f1f1f",bgAlt:"#181818",raised:"#2a2d2e",hover:"#37373d",border:"#3c3c3c",text:"#cccccc",textStrong:"#ececec",label:"#9d9d9d",accent:"#4daafc",number:"#4daafc",string:"#d1977f",red:"#e46962",redSoft:"#4e3534",redText:"#f9dedc",radius:"8px",shadow:"0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)"};function Rr(e){return Object.assign({},ps,e&&typeof e=="object"?e:null)}function kr({visible:e=!1,key:t="F1",position:n="top-left",theme:o}={}){let i=Rr(o),r=document.createElement("div"),[a,c]=n.split("-");r.style.cssText=`position:fixed;${a==="bottom"?"bottom":"top"}:12px;${c==="right"?"right":"left"}:12px;z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${i.border};border-radius:${i.radius};background:${i.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${i.shadow};color:${i.text};font:12px/1.5 ${i.mono};pointer-events:none;display:none`,document.body.appendChild(r);let u=(M,x)=>`<div style="display:flex;justify-content:space-between;gap:14px"><span style="color:${i.label}">${M}</span><span style="color:${i.textStrong}">${x}</span></div>`,s=!1,l=0,p=0,f=0,h=0;function y(M=!0){s=!!M,r.style.display=s?"block":"none",l=p=f=0}let E=()=>y(!s),v=M=>{M.key===t&&(M.preventDefault(),E())};return t&&window.addEventListener("keydown",v),y(e),{show:y,toggle:E,isVisible:()=>s,update(M){if(!s)return;l+=M.rawDt,p+=M.cpuMs,f++;let x=performance.now();if(x-h<250)return;h=x;let S=l/f*1e3;r.innerHTML=`<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px"><b style="color:${i.accent};font-size:16px;font-weight:600">${(1e3/S).toFixed(0)}<span style="font-size:11px;color:${i.label};font-weight:400"> fps</span></b><span style="color:${i.label}">${S.toFixed(1)} ms</span></div>`+u("cpu",(p/f).toFixed(2)+" ms")+u("frame",M.frame)+u("time",M.time.toFixed(2)+" s")+u("size",`${M.width}\xD7${M.height}`)+u("passes",M.passes),l=p=f=0},dispose(){t&&window.removeEventListener("keydown",v),r.remove()}}}function hs(e,t){let n=Rr(t),o=null;function i(){if(!o)return;let a=e.getBoundingClientRect();Object.assign(o.style,{left:a.left+"px",top:a.top+"px",width:a.width+"px",height:a.height+"px"})}let r=a=>String(a).replace(/&/g,"&amp;").replace(/</g,"&lt;");return{show(a){o||(o=document.createElement("div"),o.style.cssText=`position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;background:${n.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${n.text};font:13px/1.55 ${n.font}`,document.body.appendChild(o),window.addEventListener("resize",i));let c=a.errors||[],u=r(a.message.split(`
76
- `)[0]),s="";c.length?s=c.map(l=>`<div style="display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};margin-bottom:8px"><span style="color:${n.red};font-family:${n.mono};font-size:12px">line ${l.line}</span><span style="color:${n.textStrong}">${r(l.message)}</span><span></span><code style="color:${n.label};font-family:${n.mono};font-size:12px;white-space:pre-wrap">${r(l.source.trim())}</code></div>`).join(""):a.log&&(s=`<pre style="margin:0;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};color:${n.label};font:12px/1.5 ${n.mono};white-space:pre-wrap">${r(a.log)}</pre>`),o.innerHTML=`<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px"><span style="display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${n.redSoft};color:${n.redText};font-size:11.5px;font-weight:500">Shader error</span><b style="color:${n.textStrong};font-weight:600">${u}</b></div>`+s,o.style.display="block",i()},hide(){o&&(o.style.display="none")},dispose(){o&&(o.remove(),window.removeEventListener("resize",i),o=null)}}}function ms(e,t){function n(a="image/png",c){return t(),e.toDataURL(a,c)}function o(a="image/png",c){return t(),new Promise((u,s)=>e.toBlob(l=>l?u(l):s(new Error("toBlob failed")),a,c))}async function i(a="shadermate.png",c,u){c||(c=/\.jpe?g$/i.test(a)?"image/jpeg":/\.webp$/i.test(a)?"image/webp":"image/png");let s=await o(c,u);Mr(s,a)}function r({fps:a=60,mimeType:c,bitsPerSecond:u=8e6,duration:s=0,download:l}={}){if(typeof MediaRecorder>"u"||!e.captureStream)throw new Error("MediaRecorder not supported");let p=e.captureStream(a),f=c||["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm","video/mp4"].find(M=>MediaRecorder.isTypeSupported(M))||"",h=new MediaRecorder(p,{mimeType:f||void 0,videoBitsPerSecond:u}),y=[];h.ondataavailable=M=>{M.data.size&&y.push(M.data)};let E=new Promise(M=>{h.onstop=()=>M(new Blob(y,{type:h.mimeType}))});h.start(100);let v={recorder:h,stop(){return h.state!=="inactive"&&h.stop(),p.getTracks().forEach(M=>M.stop()),E},done:E};if(s>0){let M=new Promise(x=>setTimeout(()=>x(v.stop()),s));return l?M.then(x=>(Mr(x,typeof l=="string"?l:"shadermate.webm"),x)):M}return v}return{screenshot:n,toBlob:o,download:i,record:r}}function Mr(e,t){let n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}function gs(e,t){var n;if(typeof e=="string"||Array.isArray(e))return{...t||{},passes:e};if(e&&typeof e=="object"&&(e.shader!=null||e.passes!=null||e.src!=null)){let o={...e};return o.passes==null?o.passes={src:(n=o.shader)!=null?n:o.src,uniforms:o.passUniforms,channels:o.channels,pingpong:o.pingpong,float:o.float}:o.channels!=null&&console.warn("[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead."),o}throw new Se("createShader: pass a shader string, an array of passes, or { shader | passes, ...options }")}function bs(e){if(e&&typeof e=="object"&&typeof e.getContext=="function")return{canvas:e,given:!0};if(typeof e=="string"){let n=document.getElementById(e);if(!n)try{n=document.querySelector(e)}catch{}if(!n)throw new Se(`Canvas not found: "${e}"`);return{canvas:n,given:!0}}let t=document.getElementById(cr);return t?{canvas:t,given:!0}:(t=document.createElement("canvas"),t.id=cr,(document.body||document.documentElement).appendChild(t),{canvas:t,given:!1})}function Ln(e,t,n){let o=e[t];po(o)?o.value=n:e[t]=n}var so=(e,t)=>po(e[t])?e[t].value:e[t];function Ur(e,t){var n,o,i;if(!co)throw new Se("ShaderMate needs a browser environment (window/document).");let r=gs(e,t),a=r.autoSetup!==!1,c=Object.assign({},a?_r:Ia,r.inject),u=ur(r.defines),s=typeof r.common=="string"?r.common:"",l=r.dialect||"auto",p=r.samplers||{},f=r.uniforms||{},h=r.includes||{},y=!!r.strictUniforms,E=r.warnMissingUniforms!==!1,v=r.showExpandedOnError!==!1,M=r.errorOverlay===void 0||r.errorOverlay==="auto"?ta():!!r.errorOverlay,x,S,b;r.gl?(b=r.gl,x=b.canvas,S=!0):({canvas:x,given:S}=bs(r.canvas),b=da(x,r));let _=ua(b),L=fa(b,_),P={isGL2:_,ext:L},R=new na(b),j=!!(_||L.OES_standard_derivatives),C=ea((n=r.background)!=null?n:r.clearColor)||[0,0,0,0];b.clearColor(C[0],C[1],C[2],C[3]);let D=oa(),{emit:F,on:I,off:N,once:z}=D,se=pa(b),de=ds(x,r,S),oe=cs(x,de.fit,r.pointer===!1?{target:"canvas",smooth:0}:typeof r.pointer=="object"?r.pointer:{}),ee=ra(),te=M?hs(x,r.theme):null,we=null;r.stats&&(we=kr({visible:r.stats===!0||r.stats==="visible",key:r.statsKey===void 0?"F1":r.statsKey,position:r.statsPosition,theme:r.theme}));let ue=[],W=new Map,Y=[],be=!1,ce=!1,le=null,me=()=>{},pe=performance.now(),ge=0,xe=0,ke=r.time||0,ie=r.autoplay!==!1&&!r.startPaused&&!r.paused,ze=(o=r.timeScale)!=null?o:1,Be=r.fixedDelta||0,lt=r.maxFps||r.fps||0,qe=r.loop||0,Ne=(i=r.maxDelta)!=null?i:.1,Ct=!0,De=null,Ft=60,et=[],Me=null,Ye=null,Ae=!1,ht=fs(x,{enabled:r.pauseWhenHidden!==!1,onChange:T=>{Ct=T,T&&(pe=performance.now()),F("visibility",T)}});function Fe(T){De=T,te&&te.show(T),F("error",T),r.onError&&r.onError(T)}function mt(){De=null,te&&te.hide()}let tt=async T=>{let O=await fetch(T);if(!O.ok)throw new Se(`Failed to fetch ${T}: ${O.status} ${O.statusText}`);return O.text()},St=async T=>h[T]!=null?h[T]:tt(T),Ce=null;async function Tt(){if(Ce!==null)return Ce;if(!s)return Ce="";let T=ro(s)?s:await tt(s),O=xr(T);for(let $ in O.uniforms)$ in f||(f[$]=O.uniforms[$]);return Object.assign(p,O.samplers,p),Ce=O.source}async function nt(T,O,$=Y){let V=ro(O)?O:await tt(O),K=await Tt(),H=xr(V);V=H.source;for(let g in H.uniforms)!(g in T.uniforms)&&!(g in f)&&(T.uniforms[g]=H.uniforms[g]);T.annotatedSamplers=H.samplers;let J=K?K+`
70
+ `),i.builtins){d+=t?Ua:Fa,d+=Va;let b=Xa(l,t),M=/\bout\s+(?:\w+\s+)*vec4\s+\w+\s*;/.test(Lr(l));b?d+=b:t&&!M&&(d+=`out vec4 outColor;
71
+ `)}i.uniforms&&(d+=Ka(l,r,a)),i.defines&&(d+=Ja(n));let h=Lr(l),f=i.mainWrap&&/\bmainImage\s*\(/.test(h)&&!/\bvoid\s+main\s*\(/.test(h),p=d+`#line 1
72
+ `+l;return f&&(p+=t?Oa:Da),p}function Bn(e,t,n,o,i,r={},a={},{dynamic:c=!1,flipDefault:l=!1}={}){let s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);let d=r.flipY===void 0?l:!!r.flipY,h=!a.isGL2&&!(Sr(o)&&Sr(i));h&&r.wrap&&r.wrap!=="clamp"&&Zt("npot-wrap","Non-power-of-two texture in WebGL1: forcing wrap to clamp.");let f=h?e.CLAMP_TO_EDGE:wo(e,r.wrap),p=!!r.mipmap&&!c&&!h,b=vo(e,r.filter),M=p?r.filter==="nearest"?e.NEAREST_MIPMAP_NEAREST:e.LINEAR_MIPMAP_LINEAR:b;e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,M),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,b),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,f);let v=()=>{e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,d),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!!r.premultiplyAlpha),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1)};return v(),p&&e.generateMipmap(e.TEXTURE_2D),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(s,"texture2D"),width:o,height:i,source:n,update:c?()=>{n.readyState!==void 0&&n.readyState<2||(e.bindTexture(e.TEXTURE_2D,s),v(),e.bindTexture(e.TEXTURE_2D,null))}:()=>{}}}function ts(e,t,n,o={},i={}){return new Promise((r,a)=>{let c=new Image;c.crossOrigin=o.crossOrigin===void 0?"anonymous":o.crossOrigin,c.onload=()=>r(Bn(e,t,c,c.naturalWidth,c.naturalHeight,o,i)),c.onerror=()=>a(new Error(`Failed to load image "${n}"`)),c.src=n})}var ns=["+X","-X","+Y","-Y","+Z","-Z"];function os(e,t,n,o={}){return new Promise((i,r)=>{if(!Array.isArray(n)||n.length!==6)return r(new Error("cubemap needs an array of 6 URLs"));let a=e.createTexture();e.bindTexture(e.TEXTURE_CUBE_MAP,a);let c=wo(e,o.wrap),l=vo(e,o.filter);e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MIN_FILTER,l),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MAG_FILTER,l),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_S,c),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_T,c);let s=[e.TEXTURE_CUBE_MAP_POSITIVE_X,e.TEXTURE_CUBE_MAP_NEGATIVE_X,e.TEXTURE_CUBE_MAP_POSITIVE_Y,e.TEXTURE_CUBE_MAP_NEGATIVE_Y,e.TEXTURE_CUBE_MAP_POSITIVE_Z,e.TEXTURE_CUBE_MAP_NEGATIVE_Z],d=0,h=0,f=0,p=!1;n.forEach((b,M)=>{let v=new Image;v.crossOrigin="anonymous",v.onload=()=>{p||(h||(h=v.width,f=v.height),e.bindTexture(e.TEXTURE_CUBE_MAP,a),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.texImage2D(s[M],0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,v),++d===6&&(o.mipmap&&e.generateMipmap(e.TEXTURE_CUBE_MAP),e.bindTexture(e.TEXTURE_CUBE_MAP,null),i({texId:t.add(a,"textureCube"),width:h,height:f,cubemap:!0,update(){}})))},v.onerror=()=>{p||(p=!0,e.deleteTexture(a),r(new Error(`Failed to load cubemap face ${ns[M]}: "${b}"`)))},v.src=b})})}function rs(e){let t=e.play&&e.play();t&&t.catch&&t.catch(()=>{let n=()=>{e.play().catch(()=>{})};window.addEventListener("pointerdown",n,{once:!0}),window.addEventListener("keydown",n,{once:!0})})}function is(e,t,n,o={},i={}){return new Promise((r,a)=>{let c=document.createElement("video");Object.assign(c,{src:n,crossOrigin:"anonymous",loop:o.loop!==!1,muted:o.muted!==!1,playsInline:!0,autoplay:!0}),c.addEventListener("error",()=>a(new Error(`Failed to load video "${n}"`)),{once:!0}),c.addEventListener("canplay",()=>{rs(c);let l=Bn(e,t,c,c.videoWidth,c.videoHeight,{...o,flipY:o.flipY===void 0?!0:o.flipY},i,{dynamic:!0});l.getTime=()=>c.currentTime,l.media=c,l.dispose=()=>{c.pause(),c.removeAttribute("src"),c.load()},r(l)},{once:!0}),c.load()})}function as(e,t,n={},o={}){let i=typeof n.camera=="object"?n.camera:{facingMode:"user"};return navigator.mediaDevices.getUserMedia({video:i,audio:!1}).then(r=>new Promise(a=>{let c=document.createElement("video");Object.assign(c,{srcObject:r,muted:!0,playsInline:!0,autoplay:!0}),c.addEventListener("loadedmetadata",()=>{c.play().catch(()=>{});let l=Bn(e,t,c,c.videoWidth,c.videoHeight,{...n,flipY:n.flipY===void 0?!0:n.flipY},o,{dynamic:!0});l.media=c,l.dispose=()=>{c.pause(),r.getTracks().forEach(s=>s.stop())},a(l)},{once:!0})}))}function Pr(e,t,n,{mic:o=!1}={}){let i=n.layout==="spectrogram",r=n.fftSize||(i?1024:512),a=window.AudioContext||window.webkitAudioContext;return new Promise((c,l)=>{var s;let d=new a,h=d.createAnalyser();h.fftSize=r,h.smoothingTimeConstant=(s=n.smoothing)!=null?s:.8;let f=h.frequencyBinCount,p=new Uint8Array(r),b=i?f:2,M=i?3:1,v=new Uint8Array(f*b*M),k=i?new Uint8Array(f):null,x=null;i&&(x=d.createAnalyser(),x.fftSize=r,x.smoothingTimeConstant=0);let w=e.createTexture(),y=i?e.RGB:e.LUMINANCE,A=()=>{e.bindTexture(e.TEXTURE_2D,w),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,y,f,b,0,y,e.UNSIGNED_BYTE,v),e.bindTexture(e.TEXTURE_2D,null)};e.bindTexture(e.TEXTURE_2D,w),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),A();let _=()=>d.currentTime,P=()=>{},I=()=>{let F=()=>{d.state==="suspended"&&d.resume()};F(),window.addEventListener("pointerdown",F,{once:!0}),window.addEventListener("keydown",F,{once:!0}),c({texId:t.add(w,"texture2D"),width:f,height:b,analyser:h,context:d,getTime:_,update(){if(i){let G=f*3;v.copyWithin(G,0,v.length-G),h.getByteFrequencyData(k),h.getByteTimeDomainData(p);for(let N=0;N<f;N++)v[N*3]=k[N],v[N*3+1]=p[N*2];x.getByteFrequencyData(k);for(let N=0;N<f;N++)v[N*3+2]=k[N]}else h.getByteFrequencyData(v.subarray(0,f)),h.getByteTimeDomainData(p),v.set(p.subarray(0,f),f);A()},dispose(){P(),d.close&&d.close()}})};if(o){navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(F=>{let G=d.createMediaStreamSource(F);G.connect(h),x&&G.connect(x),P=()=>F.getTracks().forEach(N=>N.stop()),I()}).catch(l);return}let H=n.audio||n.audioFFT,T=H instanceof HTMLMediaElement?H:new Audio,O=T!==H;O&&Object.assign(T,{src:H,crossOrigin:"anonymous",loop:n.loop!==!1,autoplay:!0}),_=()=>T.currentTime;let D=()=>{let F=d.createMediaElementSource(T);if(F.connect(h),x&&F.connect(x),h.connect(d.destination),O){let G=()=>{d.state==="suspended"&&d.resume(),T.play().catch(()=>{})};G(),window.addEventListener("pointerdown",G,{once:!0}),window.addEventListener("keydown",G,{once:!0}),P=()=>{T.pause(),T.removeAttribute("src"),T.load()}}I()};T.readyState>=3?D():(T.addEventListener("canplay",D,{once:!0}),T.addEventListener("error",()=>l(new Error(`Failed to load audio "${H}"`)),{once:!0}),O&&T.load())})}var ss=e=>typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement,Rr=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement;function cs(e,t,n,o={},i={}){let r=n.videoWidth||n.naturalWidth||n.width||1,a=n.videoHeight||n.naturalHeight||n.height||1,c=ss(n)||Rr(n),l=o.dynamic===void 0?c:!!o.dynamic,s=Bn(e,t,n,r,a,o,i,{dynamic:l,flipDefault:c});if(Rr(n)&&(s.getTime=()=>n.currentTime),l){let d=s.update;s.update=()=>{s.width=n.videoWidth||n.naturalWidth||n.width||1,s.height=n.videoHeight||n.naturalHeight||n.height||1,d()}}return Promise.resolve(s)}function ls(e,t,n){let o=t.add(n.texture,n.cube?"textureCube":"texture2D");return t.ref(o),Promise.resolve({texId:o,width:n.width||1,height:n.height||1,cubemap:!!n.cube,update(){}})}function us(e,t,n={}){let r=new Uint8Array(768),a=new Uint8Array(256),c=new Uint8Array(256),l=new Uint8Array(256),s=n.keyboard&&typeof n.keyboard=="object"&&n.keyboard.target||window,d=v=>{if(typeof v.keyCode=="number"&&v.keyCode)return v.keyCode&255;let k=v.key||"";return k.length===1?k.toUpperCase().charCodeAt(0)&255:0},h=v=>{let k=d(v);a[k]||(c[k]=255,l[k]=l[k]?0:255),a[k]=255},f=v=>{a[d(v)]=0},p=()=>a.fill(0);s.addEventListener("keydown",h),s.addEventListener("keyup",f),window.addEventListener("blur",p);let b=e.createTexture();e.bindTexture(e.TEXTURE_2D,b),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);let M=()=>{e.bindTexture(e.TEXTURE_2D,b),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,256,3,0,e.LUMINANCE,e.UNSIGNED_BYTE,r),e.bindTexture(e.TEXTURE_2D,null)};return M(),Promise.resolve({texId:t.add(b,"texture2D"),width:256,height:3,keyboard:!0,update(){r.set(a,0),r.set(c,256),r.set(l,256*2),M(),c.fill(0)},dispose(){s.removeEventListener("keydown",h),s.removeEventListener("keyup",f),window.removeEventListener("blur",p)}})}function go(e,t,n,o){return n.texture?ls(e,t,n):n.element?cs(e,t,n.element,n,o):n.url?ts(e,t,n.url,n,o):n.video?is(e,t,n.video,n,o):n.camera?as(e,t,n,o):n.mic?Pr(e,t,n,{mic:!0}):n.keyboard?us(e,t,n):n.audio||n.audioFFT?Pr(e,t,n):n.cubemap?os(e,t,n.cubemap,n):Promise.reject(new Error("Unrecognised channel: "+JSON.stringify(n)))}function ds(e){return e?e.cubemap||e.texture&&e.cube?"cube":"2D":null}var jr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");function fs(e){let t=/^[ \t]*\/\/[ \t]*(?:=+[ \t]*)?(?:Pass[ \t]*:?[ \t]*([^\n=—–-]+?)|(Main)|(Common))[ \t]*(?:[—–-]+[^\n]*)?(?:=+)?[ \t]*$/gim,n=[],o;for(;o=t.exec(e);)n.push({index:o.index,end:o.index+o[0].length,raw:o[0],pass:o[1],main:!!o[2],common:!!o[3]});if(!n.length)return null;let i={common:e.slice(0,n[0].index).trim(),passes:[]};return n.forEach((r,a)=>{let c=e.slice(r.end,a+1<n.length?n[a+1].index:e.length).trim();if(r.common){i.common=(i.common?i.common+`
73
+ `:"")+c;return}let l=r.main?"main":String(r.pass).trim(),s=/buffer\s*type\s*:\s*(\w+)/i.exec(r.raw),d=/^(\d+)$/.exec(l);i.passes.push({name:r.main?"main":d?"pass"+d[1]:l.replace(/[^\w]+/g,"_").replace(/^_+|_+$/g,"").toLowerCase(),label:l,main:r.main,src:c,bufferType:s?s[1].toLowerCase():"2d"})}),i.common&&/[{};]/.test(jr(i.common)),i}function ps(e){let t={},n=/\[([^\]]*)\]/.exec(e||"");if(!n)return t;for(let o of n[1].toLowerCase().split(/[\s,]+/))o==="nearest"||o==="linear"?t.filter=o:o==="clamp"||o==="repeat"||o==="mirror"?t.wrap=o:o==="mipmap"?t.mipmap=!0:(o==="flipy"||o==="flip")&&(t.flipY=!0);return t}function Ir(e){let t={},n={},o=e.split(`
74
+ `),i=/^\s*uniform\s+(?:(?:lowp|mediump|highp)\s+)?(\w+)\s+(\w+)(?:\s*\[\s*\d+\s*\])?\s*(?:=\s*([^;]+))?;\s*(?:\/\/(.*))?$/;return{source:o.map(a=>{var c,l,s;let d=i.exec(a);if(!d)return a;let[,h,f,p,b=""]=d,M=b.trim();if(/^sampler/.test(h)){let k=hs(f,M,h);k&&(n[f]=k)}else{let k={},x=I=>(I.match(/-?\d*\.?\d+(?:e-?\d+)?/g)||[]).map(Number),w=/\[([^\]]*)\]/.exec(M),y=x(M.replace(/\[[^\]]*\]/,"")),A=/vec(\d)/.test(h)?+h.match(/vec(\d)/)[1]:1,_=/^bool/.test(h),P;if(p){let I=x(p);P=A===1?_?/true/.test(p):(c=I[0])!=null?c:0:I.slice(0,A)}else y.length&&(P=A===1?y[0]:y.length>=A?y.slice(0,A):new Array(A).fill(y[0]));if(w){let I=x(w[1]);I.length>=2&&(k.min=I[0],k.max=I[1],I.length>=3&&(k.step=I[2]))}(P!==void 0||w)&&(k.value=P!==void 0?P:A===1?(l=k.min)!=null?l:0:new Array(A).fill((s=k.min)!=null?s:0),t[f]=k)}return p?a.replace(/\s*=\s*[^;]+;/,";"):a}).join(`
75
+ `),uniforms:t,samplers:n}}function hs(e,t,n){let o=ps(t),i=t.replace(/\[[^\]]*\]/g,"").trim(),r=/^ref:\s*(.+)$/i.exec(i);if(r){let a=r[1].trim(),c;return(c=/^pass\s*(\d+)(?::out(\d+))?$/i.exec(a))?{pass:"pass"+c[1],...o}:(c=/^pass:\s*(\S+)/i.exec(a))?{pass:c[1],...o}:/^main$/i.test(a)?{pass:"main",...o}:(c=/^sampler\s+(\w+)/i.exec(a))?{sameAs:c[1],...o}:null}if(e==="u_audio"||/audio/i.test(e)&&/^(mic|\[CAM\]|\[VIDEO\])?$/i.test(i))return/^https?:|^data:/i.test(i)?{audio:i,layout:"spectrogram"}:{mic:!0,layout:"spectrogram"};if(e==="u_webcam")return{camera:!0,...o};if(e==="u_keyboard")return{keyboard:!0};if(/^(https?:|data:)/i.test(i)){let a=i.split(/\s+/)[0];return/\.(mp4|webm|mov|ogv|m4v)(\?|$)/i.test(a)?{video:a,...o}:/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(a)?{audio:a,layout:"spectrogram"}:n==="samplerCube"?null:{url:a,...o}}return null}function ms(e){return/\bu_mouse\s*\.\s*[xyzw]*[zw]/.test(jr(e))}var gs=35678,bs=35680,ys=e=>e.filter(t=>!t.cfg.screen);function xs(e,t,n={}){let o=[],i=ys(t),r=t.find(l=>l.cfg.screen),a=new Map(t.map(l=>[l.name,l])),c=Object.assign({},e.cfg.annotatedSamplers,e.cfg.samplers);for(let l in e.uniformInfo){let s=e.uniformInfo[l];if(s.type!==gs&&s.type!==bs||/^iChannel\d$/.test(l))continue;let d=n[l]||c[l]||null,h;if(d&&d.sameAs&&(d=c[d.sameAs]||n[d.sameAs]||null),d||(l==="u_passes"&&s.size>1?d={array:i.slice(0,s.size)}:l==="u_main"?d=r?{pass:r.name}:null:(h=/^u_pass(\d+)$/.exec(l))&&i[+h[1]-1]?d={pass:i[+h[1]-1].name}:l.startsWith("u_")&&a.has(l.slice(2))?d={pass:l.slice(2)}:l==="u_audio"?d={mic:!0,layout:"spectrogram"}:l==="u_keyboard"?d={keyboard:!0}:l==="u_webcam"&&(d={camera:!0})),d&&d.pass!=null&&!a.has(d.pass)){let f=/^pass(\d+)$/.exec(d.pass);f&&i[+f[1]-1]?d={...d,pass:i[+f[1]-1].name}:d.pass==="main"&&r&&(d={...d,pass:r.name})}d&&o.push({name:l,info:s,spec:d})}return o}function ws(e){let t=e.find(n=>n.cfg.screen);return t?e.some(n=>(n.samplers||[]).some(o=>o.spec.pass===t.name)||n.cfg.channels.some(o=>o&&o.pass===t.name)):!1}function vs(e,{target:t=window,speed:n=1.5,sensitivity:o=.004}={}){let i=[0,0,0],r=-Math.PI/2,a=0,c=new Set,l=!1,s=0,d=0,h=[0,0,-1],f=new Float32Array(16),p=(_,P)=>{let I=_.key.length===1?_.key.toLowerCase():_.key;P?c.add(I):c.delete(I)},b=_=>p(_,!0),M=_=>p(_,!1),v=_=>{_.button===0&&(l=!0,s=_.clientX,d=_.clientY)},k=_=>{l&&(r+=(_.clientX-s)*o,a-=(_.clientY-d)*o,a=Math.max(-1.55,Math.min(1.55,a)),s=_.clientX,d=_.clientY)},x=()=>{l=!1},w=_=>{let P=h,I=-_.deltaY*.002*n;i[0]+=P[0]*I,i[1]+=P[1]*I,i[2]+=P[2]*I},y=()=>c.clear();t.addEventListener("keydown",b),t.addEventListener("keyup",M),e.addEventListener("pointerdown",v),window.addEventListener("pointermove",k),window.addEventListener("pointerup",x),e.addEventListener("wheel",w,{passive:!0}),window.addEventListener("blur",y);function A(){let _=h,P=[0,1,0],I=[_[1]*P[2]-_[2]*P[1],_[2]*P[0]-_[0]*P[2],_[0]*P[1]-_[1]*P[0]],H=Math.hypot(I[0],I[1],I[2])||1;I=I.map(O=>O/H);let T=[I[1]*_[2]-I[2]*_[1],I[2]*_[0]-I[0]*_[2],I[0]*_[1]-I[1]*_[0]];return f.set([I[0],T[0],-_[0],0,I[1],T[1],-_[1],0,I[2],T[2],-_[2],0,-(I[0]*i[0]+I[1]*i[1]+I[2]*i[2]),-(T[0]*i[0]+T[1]*i[1]+T[2]*i[2]),_[0]*i[0]+_[1]*i[1]+_[2]*i[2],1]),{right:I,up:T}}return{pos:i,dir:h,view:f,update(_){h[0]=Math.cos(a)*Math.cos(r),h[1]=Math.sin(a),h[2]=Math.cos(a)*Math.sin(r);let{right:P}=A(),I=n*_*(c.has("Shift")?3:1),H=(T,O)=>{i[0]+=T[0]*O,i[1]+=T[1]*O,i[2]+=T[2]*O};(c.has("w")||c.has("ArrowUp"))&&H(h,I),(c.has("s")||c.has("ArrowDown"))&&H(h,-I),(c.has("d")||c.has("ArrowRight"))&&H(P,I),(c.has("a")||c.has("ArrowLeft"))&&H(P,-I),(c.has("e")||c.has(" "))&&(i[1]+=I),(c.has("q")||c.has("c"))&&(i[1]-=I),A()},dispose(){t.removeEventListener("keydown",b),t.removeEventListener("keyup",M),e.removeEventListener("pointerdown",v),window.removeEventListener("pointermove",k),window.removeEventListener("pointerup",x),e.removeEventListener("wheel",w),window.removeEventListener("blur",y)}}}var Vr=Object.create(null),pt=(e,...t)=>t.forEach(n=>{Vr[n.toLowerCase()]=e});pt({kind:"f",n:1},"float","number","f","1f","1fv","float[]","uniform1f","uniform1fv");pt({kind:"f",n:2},"vec2","2f","2fv","vec2[]","uniform2f","uniform2fv");pt({kind:"f",n:3},"vec3","3f","3fv","vec3[]","uniform3f","uniform3fv");pt({kind:"f",n:4},"vec4","4f","4fv","vec4[]","uniform4f","uniform4fv");pt({kind:"i",n:1},"int","bool","boolean","i","1i","1iv","int[]","bool[]","uniform1i","uniform1iv");pt({kind:"i",n:2},"ivec2","bvec2","2i","2iv","ivec2[]","bvec2[]","uniform2i","uniform2iv");pt({kind:"i",n:3},"ivec3","bvec3","3i","3iv","ivec3[]","bvec3[]","uniform3i","uniform3iv");pt({kind:"i",n:4},"ivec4","bvec4","4i","4iv","ivec4[]","bvec4[]","uniform4i","uniform4iv");pt({kind:"u",n:1},"uint","1ui","1uiv","uint[]");pt({kind:"u",n:2},"uvec2","2ui","2uiv","uvec2[]");pt({kind:"u",n:3},"uvec3","3ui","3uiv","uvec3[]");pt({kind:"u",n:4},"uvec4","4ui","4uiv","uvec4[]");pt({kind:"m",n:2},"mat2","matrix2fv","mat2fv","uniformmatrix2fv");pt({kind:"m",n:3},"mat3","matrix3fv","mat3fv","uniformmatrix3fv");pt({kind:"m",n:4},"mat4","matrix4fv","mat4fv","uniformmatrix4fv");function Es(e){return typeof e!="string"?null:Vr[e.trim().toLowerCase()]||null}var ks={5126:{kind:"f",n:1},35664:{kind:"f",n:2},35665:{kind:"f",n:3},35666:{kind:"f",n:4},5124:{kind:"i",n:1},35667:{kind:"i",n:2},35668:{kind:"i",n:3},35669:{kind:"i",n:4},35670:{kind:"i",n:1},35671:{kind:"i",n:2},35672:{kind:"i",n:3},35673:{kind:"i",n:4},5125:{kind:"u",n:1},36294:{kind:"u",n:2},36295:{kind:"u",n:3},36296:{kind:"u",n:4},35674:{kind:"m",n:2},35675:{kind:"m",n:3},35676:{kind:"m",n:4}};function Ms(e){return ks[e]}var Ss=5126,Ur=35666;function ko(e){return e!=null&&typeof e=="object"&&!ya(e)&&"value"in e}var Fr=e=>typeof e=="boolean"?e?1:0:e;function bo(e,t){return typeof e=="number"||typeof e=="boolean"?new Array(t).fill(Fr(e)):ArrayBuffer.isView(e)?e:Array.isArray(e)&&e.some(n=>typeof n=="boolean")?e.map(Fr):e}function Cs(e,t,n,o,i){let r=n.n;switch(n.kind){case"f":return r===1&&typeof o=="number"?e.uniform1f(t,o):e["uniform"+r+"fv"](t,bo(o,r));case"i":return r===1&&(typeof o=="number"||typeof o=="boolean")?e.uniform1i(t,+o):e["uniform"+r+"iv"](t,bo(o,r));case"u":return r===1&&typeof o=="number"?e.uniform1ui(t,o):e["uniform"+r+"uiv"](t,bo(o,r));case"m":return e["uniformMatrix"+r+"fv"](t,!!i,o)}}function Or(e,t,n,{strict:o=!1,warnMissing:i=!1,label:r=""}={}){if(n)for(let a in n){let c=n[a],l=ko(c)?c:null,s=l?l.value:c;if(s==null)continue;let d=t[a];if(!d||!d.loc){if(o)throw new et("Unknown uniform: "+a);i&&Zt("missing-uniform:"+r+":"+a,`Uniform "${a}" not found in ${r?`pass "${r}"`:"shader"} (misspelled, undeclared, or optimized out).`);continue}let h;if(l&&l.type!=null){if(h=Es(l.type),!h){if(o)throw new et("Unknown uniform type: "+l.type+" for "+a);Zt("bad-type:"+a,"Unknown uniform type",l.type,a);continue}}else if(h=Ms(d.type),!h)continue;Cs(e,d.loc,h,s,l&&l.transpose)}}function Ts(e,t,n={}){let o=n.target==="canvas"?e:n.target&&typeof n.target=="object"?n.target:window,i=+n.smooth||0,r={x:0,y:0,down:!1,over:!1,dragX:0,dragY:0,wheel:0},a={x:0,y:0,clickX:0,clickY:0,down:!1,over:!1,uvX:0,uvY:0,dragX:0,dragY:0,wheel:0,clicked:!1},c=!1,l=0,s=0,d=!1;function h(){let w=e.getBoundingClientRect(),y=t?t():"fill";if(!w.width||!w.height||y!=="contain"&&y!=="cover")return w;let A=e.width/e.height,_=w.width/w.height,P,I;return _>A==(y==="contain")?(I=w.height,P=I*A):(P=w.width,I=P/A),{left:w.left+(w.width-P)/2,top:w.top+(w.height-I)/2,width:P,height:I,bottom:0,right:0}}function f(w,y){let A=h();return!A.width||!A.height?[0,0]:[(w-A.left)*(e.width/A.width),(A.top+A.height-y)*(e.height/A.height)]}let p=(w,y)=>{let[A,_]=f(w,y);return[A/e.width,_/e.height]},b=w=>{let[y,A]=f(w.clientX,w.clientY);r.down&&(r.dragX+=y-l,r.dragY+=A-s),l=y,s=A,r.x=y,r.y=A,r.over=y>=0&&A>=0&&y<=e.width&&A<=e.height,d||(d=!0,a.x=y,a.y=A)},M=w=>{w.button!==void 0&&w.button!==0||(b(w),!(o===window&&!r.over)&&(r.down=!0,a.down=!0,c=!0,l=r.x,s=r.y,a.clickX=r.x,a.clickY=r.y,i||(a.x=r.x,a.y=r.y)))},v=()=>{r.down=!1,a.down=!1},k=()=>{r.over=!1},x=w=>{r.wheel+=-w.deltaY*.002};return n.touch!==!1&&o===e&&(e.style.touchAction="none"),o.addEventListener("pointermove",b,{passive:!0}),o.addEventListener("pointerdown",M,{passive:!0}),window.addEventListener("pointerup",v,{passive:!0}),window.addEventListener("pointercancel",v,{passive:!0}),o.addEventListener("pointerleave",k,{passive:!0}),o.addEventListener("wheel",x,{passive:!0}),{state:a,toShader:f,toUV:p,update(){if(i>0&&i<1){let w=1-Math.pow(1-i,1);a.x+=(r.x-a.x)*w,a.y+=(r.y-a.y)*w}else a.x=r.x,a.y=r.y;a.over=r.over,a.clicked=c,c=!1,a.dragX=r.dragX,a.dragY=r.dragY,a.wheel=r.wheel,a.uvX=e.width?a.x/e.width:0,a.uvY=e.height?a.y/e.height:0},dispose(){o.removeEventListener("pointermove",b),o.removeEventListener("pointerdown",M),window.removeEventListener("pointerup",v),window.removeEventListener("pointercancel",v),o.removeEventListener("pointerleave",k),o.removeEventListener("wheel",x)}}}function As(e){if(!e)return 0;if(typeof e=="number")return e;if(Array.isArray(e))return e[0]/e[1];if(typeof e=="string"){let t=e.split(/[:/x]/).map(Number);return t.length===2&&t[1]?t[0]/t[1]:Number(e)||0}return 0}function _s(e={},t=!0){var n,o,i,r,a,c;let l=(n=e.size)!=null?n:e.sizing,s={mode:t?"canvas":"window",width:0,height:0,aspect:As(e.aspect),fit:e.fit||"contain",pixelRatio:(i=(o=e.pixelRatio)!=null?o:e.dpr)!=null?i:"auto",maxPixelRatio:(r=e.maxPixelRatio)!=null?r:2,scale:(c=(a=e.scale)!=null?a:e.renderScale)!=null?c:1};return Array.isArray(l)?(s.mode="fixed",s.width=l[0],s.height=l[1]):typeof l=="string"?s.mode=l==="screen"||l==="fullscreen"?"window":l==="element"?"canvas":l:l&&typeof l=="object"&&(s.mode="fixed",s.width=l.width,s.height=l.height,l.fit&&(s.fit=l.fit)),s.mode==="fixed"&&(s.aspect=s.width/s.height),s}function Ls(e,t={},n=!0){let o=_s(t,n),i=()=>o.pixelRatio==="auto"?Math.min(window.devicePixelRatio||1,o.maxPixelRatio):Number(o.pixelRatio)||1,r=!1;function a(){return o.mode==="window"?{w:window.innerWidth,h:window.innerHeight}:{w:e.clientWidth||window.innerWidth,h:e.clientHeight||window.innerHeight}}function c(){if(o.mode==="fixed")return{w:o.width,h:o.height};let s=a(),d=i()*o.scale,h=s.w,f=s.h;return o.aspect&&(h/f>o.aspect?h=f*o.aspect:f=h/o.aspect),{w:h*d,h:f*d}}function l(){r||(r=!0,o.mode==="window"&&(e.style.cssText+=";display:block;position:fixed;left:0;top:0;width:100%;height:100%;"),(o.mode==="fixed"||o.aspect)&&(e.style.objectFit=o.fit))}return{cfg:o,fit:()=>o.mode==="fixed"||o.aspect?o.fit:"fill",setFixed(s,d){o.mode="fixed",o.width=s,o.height=d,o.aspect=s/d,r=!1},update(){l();let s=c(),d=Math.max(1,Math.round(s.w)),h=Math.max(1,Math.round(s.h));return e.width===d&&e.height===h?!1:(e.width=d,e.height=h,!0)},observe(s){let d=!1,h=()=>{d||(d=!0,requestAnimationFrame(()=>{d=!1,s()}))};window.addEventListener("resize",h);let f=null;return o.mode==="canvas"&&typeof ResizeObserver<"u"&&(f=new ResizeObserver(h),f.observe(e)),()=>{window.removeEventListener("resize",h),f&&f.disconnect()}}}}function Ps(e,{enabled:t=!0,margin:n="100px",onChange:o}={}){let i=typeof document>"u"?!0:!document.hidden,r=!0,a=()=>o&&o(i&&r),c=()=>{i=!document.hidden,a()},l=null;return t&&(document.addEventListener("visibilitychange",c),typeof IntersectionObserver<"u"&&(l=new IntersectionObserver(s=>{for(let d of s)r=d.isIntersecting;a()},{rootMargin:n}),l.observe(e))),{get visible(){return i&&r},dispose(){t&&document.removeEventListener("visibilitychange",c),l&&l.disconnect()}}}var Rs={font:'"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',mono:'"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace',bg:"#1f1f1f",bgAlt:"#181818",raised:"#2a2d2e",hover:"#37373d",border:"#3c3c3c",text:"#cccccc",textStrong:"#ececec",label:"#9d9d9d",accent:"#4daafc",number:"#4daafc",string:"#d1977f",red:"#e46962",redSoft:"#4e3534",redText:"#f9dedc",radius:"8px",shadow:"0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)"};function Xr(e){return Object.assign({},Rs,e&&typeof e=="object"?e:null)}function Dr({visible:e=!1,key:t="F1",position:n="top-left",theme:o}={}){let i=Xr(o),r=document.createElement("div"),[a,c]=n.split("-");r.style.cssText=`position:fixed;${a==="bottom"?"bottom":"top"}:12px;${c==="right"?"right":"left"}:12px;z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${i.border};border-radius:${i.radius};background:${i.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${i.shadow};color:${i.text};font:12px/1.5 ${i.mono};pointer-events:none;display:none`,document.body.appendChild(r);let l=(k,x)=>`<div style="display:flex;justify-content:space-between;gap:14px"><span style="color:${i.label}">${k}</span><span style="color:${i.textStrong}">${x}</span></div>`,s=!1,d=0,h=0,f=0,p=0;function b(k=!0){s=!!k,r.style.display=s?"block":"none",d=h=f=0}let M=()=>b(!s),v=k=>{k.key===t&&(k.preventDefault(),M())};return t&&window.addEventListener("keydown",v),b(e),{show:b,toggle:M,isVisible:()=>s,update(k){if(!s)return;d+=k.rawDt,h+=k.cpuMs,f++;let x=performance.now();if(x-p<250)return;p=x;let w=d/f*1e3;r.innerHTML=`<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px"><b style="color:${i.accent};font-size:16px;font-weight:600">${(1e3/w).toFixed(0)}<span style="font-size:11px;color:${i.label};font-weight:400"> fps</span></b><span style="color:${i.label}">${w.toFixed(1)} ms</span></div>`+l("cpu",(h/f).toFixed(2)+" ms")+l("frame",k.frame)+l("time",k.time.toFixed(2)+" s")+l("size",`${k.width}\xD7${k.height}`)+l("passes",k.passes),d=h=f=0},dispose(){t&&window.removeEventListener("keydown",v),r.remove()}}}function Is(e,t){let n=Xr(t),o=null;function i(){if(!o)return;let a=e.getBoundingClientRect();Object.assign(o.style,{left:a.left+"px",top:a.top+"px",width:a.width+"px",height:a.height+"px"})}let r=a=>String(a).replace(/&/g,"&amp;").replace(/</g,"&lt;");return{show(a){o||(o=document.createElement("div"),o.style.cssText=`position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;background:${n.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${n.text};font:13px/1.55 ${n.font}`,document.body.appendChild(o),window.addEventListener("resize",i));let c=a.errors||[],l=r(a.message.split(`
76
+ `)[0]),s="";c.length?s=c.map(d=>`<div style="display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};margin-bottom:8px"><span style="color:${n.red};font-family:${n.mono};font-size:12px">line ${d.line}</span><span style="color:${n.textStrong}">${r(d.message)}</span><span></span><code style="color:${n.label};font-family:${n.mono};font-size:12px;white-space:pre-wrap">${r(d.source.trim())}</code></div>`).join(""):a.log&&(s=`<pre style="margin:0;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};color:${n.label};font:12px/1.5 ${n.mono};white-space:pre-wrap">${r(a.log)}</pre>`),o.innerHTML=`<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px"><span style="display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${n.redSoft};color:${n.redText};font-size:11.5px;font-weight:500">Shader error</span><b style="color:${n.textStrong};font-weight:600">${l}</b></div>`+s,o.style.display="block",i()},hide(){o&&(o.style.display="none")},dispose(){o&&(o.remove(),window.removeEventListener("resize",i),o=null)}}}function Us(e,t){function n(a="image/png",c){return t(),e.toDataURL(a,c)}function o(a="image/png",c){return t(),new Promise((l,s)=>e.toBlob(d=>d?l(d):s(new Error("toBlob failed")),a,c))}async function i(a="shadermate.png",c,l){c||(c=/\.jpe?g$/i.test(a)?"image/jpeg":/\.webp$/i.test(a)?"image/webp":"image/png");let s=await o(c,l);$r(s,a)}function r({fps:a=60,mimeType:c,bitsPerSecond:l=8e6,duration:s=0,download:d}={}){if(typeof MediaRecorder>"u"||!e.captureStream)throw new Error("MediaRecorder not supported");let h=e.captureStream(a),f=c||["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm","video/mp4"].find(k=>MediaRecorder.isTypeSupported(k))||"",p=new MediaRecorder(h,{mimeType:f||void 0,videoBitsPerSecond:l}),b=[];p.ondataavailable=k=>{k.data.size&&b.push(k.data)};let M=new Promise(k=>{p.onstop=()=>k(new Blob(b,{type:p.mimeType}))});p.start(100);let v={recorder:p,stop(){return p.state!=="inactive"&&p.stop(),h.getTracks().forEach(k=>k.stop()),M},done:M};if(s>0){let k=new Promise(x=>setTimeout(()=>x(v.stop()),s));return d?k.then(x=>($r(x,typeof d=="string"?d:"shadermate.webm"),x)):k}return v}return{screenshot:n,toBlob:o,download:i,record:r}}function $r(e,t){let n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}function Fs(e,t){var n;if(typeof e=="string"||Array.isArray(e))return{...t||{},passes:e};if(e&&typeof e=="object"&&(e.shader!=null||e.passes!=null||e.src!=null)){let o={...e};return o.passes==null?o.passes={src:(n=o.shader)!=null?n:o.src,uniforms:o.passUniforms,channels:o.channels,pingpong:o.pingpong,float:o.float}:o.channels!=null&&console.warn("[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead."),o}throw new et("createShader: pass a shader string, an array of passes, or { shader | passes, ...options }")}function Os(e){if(e&&typeof e=="object"&&typeof e.getContext=="function")return{canvas:e,given:!0};if(typeof e=="string"){let n=document.getElementById(e);if(!n)try{n=document.querySelector(e)}catch{}if(!n)throw new et(`Canvas not found: "${e}"`);return{canvas:n,given:!0}}let t=document.getElementById(Er);return t?{canvas:t,given:!0}:(t=document.createElement("canvas"),t.id=Er,(document.body||document.documentElement).appendChild(t),{canvas:t,given:!1})}function zn(e,t,n){let o=e[t];ko(o)?o.value=n:e[t]=n}var yo=(e,t)=>ko(e[t])?e[t].value:e[t];function Wr(e,t){var n,o,i;if(!xo)throw new et("ShaderMate needs a browser environment (window/document).");let r=Fs(e,t),a=r.autoSetup!==!1,c=Object.assign({},a?Hr:Qa,r.inject),l=Mr(r.defines),s=typeof r.common=="string"?r.common:"",d=r.dialect||"auto",h=r.samplers||{},f=r.uniforms||{},p=r.includes||{},b=!!r.strictUniforms,M=r.warnMissingUniforms!==!1,v=r.showExpandedOnError!==!1,k=r.errorOverlay===void 0||r.errorOverlay==="auto"?wa():!!r.errorOverlay,x,w,y;r.gl?(y=r.gl,x=y.canvas,w=!0):({canvas:x,given:w}=Os(r.canvas),y=La(x,r));let A=_a(y),_=Pa(y,A),P={isGL2:A,ext:_},I=new va(y),H=!!(A||_.OES_standard_derivatives),T=xa((n=r.background)!=null?n:r.clearColor)||[0,0,0,0];y.clearColor(T[0],T[1],T[2],T[3]);let O=Ea(),{emit:D,on:F,off:G,once:N}=O,ve=Ra(y),ke=Ls(x,r,w),fe=Ts(x,ke.fit,r.pointer===!1?{target:"canvas",smooth:0}:typeof r.pointer=="object"?r.pointer:{}),se=ka(),de=k?Is(x,r.theme):null,ze=null;r.stats&&(ze=Dr({visible:r.stats===!0||r.stats==="visible",key:r.statsKey===void 0?"F1":r.statsKey,position:r.statsPosition,theme:r.theme}));let me=[],W=new Map,V=[],Ce=!1,xe=!1,z=null,ge=()=>{},be=performance.now(),pe=0,Se=0,Ie=r.time||0,Re=r.autoplay!==!1&&!r.startPaused&&!r.paused,Ze=(o=r.timeScale)!=null?o:1,ce=r.fixedDelta||0,Je=r.maxFps||r.fps||0,nt=r.loop||0,Oe=(i=r.maxDelta)!=null?i:.1,Ye=!0,ot=null,St=60,rt=[],Ue=null,We=null,qe=!1,Et=Ps(x,{enabled:r.pauseWhenHidden!==!1,onChange:C=>{Ye=C,C&&(be=performance.now()),D("visibility",C)}});function mt(C){ot=C,de&&de.show(C),D("error",C),r.onError&&r.onError(C)}function Be(){ot=null,de&&de.hide()}let gt=async C=>{let U=await fetch(C);if(!U.ok)throw new et(`Failed to fetch ${C}: ${U.status} ${U.statusText}`);return U.text()},Fe=async C=>p[C]!=null?p[C]:gt(C),Ge=null;async function st(){if(Ge!==null)return Ge;if(!s)return Ge="";let C=mo(s)?s:await gt(s),U=Ir(C);for(let B in U.uniforms)B in f||(f[B]=U.uniforms[B]);return Object.assign(h,U.samplers,h),Ge=U.source}async function bt(C,U,B=V){let K=mo(U)?U:await gt(U),re=await st(),j=Ir(K);K=j.source;for(let X in j.uniforms)!(X in C.uniforms)&&!(X in f)&&(C.uniforms[X]=j.uniforms[X]);C.annotatedSamplers=j.samplers;let te=re?re+`
77
77
  #line 1
78
- `+V:V,ae=await Ra(J,{loader:St}),ye=l==="fragcoord"||l==="auto"&&Pa(ae),w=[],G=$.filter(g=>!g.screen);$.forEach(g=>w.push("u_"+g.name)),G.forEach((g,k)=>{let A="u_pass"+(k+1);w.includes(A)||w.push(A)});let ne=Oa(ae,{isGL2:_,defines:[...u,...ur(T.defines)],enableDerivatives:j,inject:c,channelTypes:T.channels.map(Xa),builtinOpts:{fragcoord:ye,mouseVec4:ye||l==="fragcoord"||Ka(ae),scrollFloat:ye||l==="fragcoord",samplerNames:w,passCount:G.length}}),d=Sr(b,_?Tr:Ar,ne,{label:T.name,showExpandedOnError:v});if(d.error)throw d.error;return{program:d.program,source:V,compiled:ne,fragcoord:ye}}function Ke(){for(let T of ue){let O=T.cfg;if(O.screen&&!Ae)continue;let[$,V]=O.screen?[x.width,x.height]:Ma(O.size,x.width,x.height);T.target&&T.target.width===$&&T.target.height===V||(Pn(R,T.target),Pn(R,T.targetPrev),T.target=mr(b,R,$,V,O,_,L),T.targetPrev=O.pingpong||O.screen&&Ae?mr(b,R,$,V,O,_,L):null)}}function ot(){be||de.update()&&(b.viewport(0,0,x.width,x.height),Ke(),F("resize",{width:x.width,height:x.height}),!ie&&ce&&$e())}async function gt(T){await Promise.all(T.cfg.channels.map(async(O,$)=>{if(!(!O||O.pass!=null))try{T.texChannels[$]=await io(b,R,O,P)}catch(V){console.warn(`[ShaderMate] Pass "${T.name}" channel ${$}: ${V.message}`),F("error",V)}})),T.samplers=es(T,ue,p),await Promise.all(T.samplers.map(async O=>{if(!(O.spec.pass!=null||O.spec.array))try{O.wrap=await io(b,R,O.spec,P)}catch($){console.warn(`[ShaderMate] Pass "${T.name}" sampler ${O.name}: ${$.message}`),F("error",$)}}))}function ut(T){if(typeof T!="string"||!ro(T))return T;let O=Wa(T);if(!O)return T;O.common&&(s=s?s+`
79
- `+O.common:O.common);let $=O.passes.find(K=>K.bufferType!=="2d");if($)throw new Se(`Pass "${$.label}" uses a ${$.bufferType} buffer; ShaderMate supports 2D buffers only.`);let V=O.passes.map(K=>K.main?{name:"main",shader:K.src,screen:!0}:{name:K.name,shader:K.src,pingpong:!0,float:!0});return V.some(K=>K.screen)||(V[V.length-1].screen=!0),V}async function Ge(){Y=aa(ut(r.passes));for(let T of Y)T.iterations>1&&!T.screen&&(T.pingpong=!0);for(let T=0;T<Y.length;T++){let O=Y[T],{program:$,source:V,compiled:K,fragcoord:H}=await nt(O,O.src);if(be){b.deleteProgram($);return}let J={cfg:O,name:O.name,index:T,programId:R.add($,"program"),uniformInfo:hr(b,$),source:V,compiled:K,fragcoord:H,target:null,targetPrev:null,texChannels:new Array(ln).fill(null),samplers:[]};ue.push(J),W.set(J.name,J)}await Promise.all(ue.map(gt)),!be&&(Ae=ts(ue),Ae&&!Ye&&(Ye=va(b,_,se)),!Me&&ue.some(T=>T.uniformInfo.u_camera_pos||T.uniformInfo.u_camera_dir||T.uniformInfo.u_camera_view)&&(Me=ns(x,typeof r.camera=="object"?r.camera:{})),Ke())}function dt(T,O,$){let V=null;return O.targetPrev?V=$==="prev"||$!=="current"&&O.index>=T.index?O.targetPrev:O.target:O===T?Ht("self:"+T.name,`Pass "${T.name}" reads its own output; add pingpong: true.`):O.cfg.screen?Ht("screen:"+O.name,`Pass "${T.name}" can't read screen pass "${O.name}" (it has no texture).`):V=O.target,V}function je(T,O,$=0){let V=T.cfg,K=R.get(T.programId),H=T.uniformInfo,J=oe.state,ae=(U,B)=>{let X=H[U];X&&b.uniform1f(X.loc,B)},ye=(U,B)=>{let X=H[U];X&&b.uniform1i(X.loc,B)};if(T.targetPrev){let U=T.targetPrev;T.targetPrev=T.target,T.target=U}let w,G;V.screen&&!Ae?(b.bindFramebuffer(b.FRAMEBUFFER,null),w=x.width,G=x.height):(b.bindFramebuffer(b.FRAMEBUFFER,R.get(T.target.fboId)),w=T.target.width,G=T.target.height);let ne=V.screen?1:w/x.width,d=V.screen?1:G/x.height;if(b.viewport(0,0,w,G),b.useProgram(K),b.clear(b.COLOR_BUFFER_BIT|(T.target&&T.target.depthId?b.DEPTH_BUFFER_BIT:0)),ae("iTime",O.time),ae("u_time",O.time),ae("iTimeDelta",O.dt),ae("u_delta",O.dt),ae("u_time_delta",O.dt),ye("iFrame",O.frame),ye("u_frame",O.frame),ae("iFrameRate",O.fps),ae("u_fps",O.fps),ae("u_refresh_rate",O.refreshRate),ae("iSampleRate",44100),H.iResolution&&b.uniform3f(H.iResolution.loc,w,G,1),H.u_resolution&&b.uniform2f(H.u_resolution.loc,w,G),ae("u_aspect",w/G),ae("u_pixelRatio",O.dpr),H.iDate&&b.uniform4fv(H.iDate.loc,O.date),H.u_date&&b.uniform4fv(H.u_date.loc,O.date),H.iScroll&&b.uniform2f(H.iScroll.loc,O.scrollX,O.scrollY),H.u_scroll&&(H.u_scroll.type===as?b.uniform1f(H.u_scroll.loc,J.wheel):b.uniform2f(H.u_scroll.loc,O.scrollX,O.scrollY)),ae("u_wheel",J.wheel),H.u_drag&&b.uniform2f(H.u_drag.loc,J.dragX*ne,J.dragY*d),ye("u_recursion",$),ye("u_max_recursion",V.iterations||1),ye("u_color_gamut",0),Me&&(H.u_camera_pos&&b.uniform3fv(H.u_camera_pos.loc,Me.pos),H.u_camera_dir&&b.uniform3fv(H.u_camera_dir.loc,Me.dir),H.u_camera_view&&b.uniformMatrix4fv(H.u_camera_view.loc,!1,Me.view)),H.iMouse){let U=J.down?1:-1,B=J.clicked?1:-1;b.uniform4f(H.iMouse.loc,J.x*ne,J.y*d,J.clickX*ne*U,J.clickY*d*B)}if(H.u_mouse)if(H.u_mouse.type===wr){let U=J.down?1:-1;b.uniform4f(H.u_mouse.loc,J.x*ne,J.y*d,J.clickX*ne*U,J.clickY*d*U)}else b.uniform2f(H.u_mouse.loc,J.x*ne,J.y*d);H.u_mouseUV&&b.uniform2f(H.u_mouseUV.loc,J.uvX,J.uvY),ae("u_mouseDown",J.down?1:0);let g=[0,0,0,0],k=new Float32Array(12);for(let U=0;U<ln;U++){let B=V.channels[U];if(!B)continue;let X=null,re=0,fe=0,_e=!1,Ve=O.time;if(B.pass!=null){let Qe=W.get(B.pass),xn=Qe?dt(T,Qe,B.buffer):null;xn&&(X=R.get(xn.texId),re=xn.width,fe=xn.height)}else{let Qe=T.texChannels[U];Qe&&(X=R.get(Qe.texId),re=Qe.width,fe=Qe.height,_e=!!Qe.cubemap,Qe.getTime&&(Ve=Qe.getTime()))}X&&(b.activeTexture(b.TEXTURE0+U),b.bindTexture(_e?b.TEXTURE_CUBE_MAP:b.TEXTURE_2D,X),ye("iChannel"+U,U),g[U]=Ve,k[U*3]=re,k[U*3+1]=fe,k[U*3+2]=1)}H.iChannelTime&&(H.iChannelTime.type===wr?b.uniform4fv:b.uniform1fv).call(b,H.iChannelTime.loc,g),H.iChannelResolution&&b.uniform3fv(H.iChannelResolution.loc,k);let A=ln;for(let U of T.samplers){let B=(X,re)=>(b.activeTexture(b.TEXTURE0+A),b.bindTexture(re?b.TEXTURE_CUBE_MAP:b.TEXTURE_2D,X),A++);if(U.spec.array){let X=U.spec.array.map(re=>{let fe=dt(T,re,U.spec.buffer);return fe?B(R.get(fe.texId),!1):0});b.uniform1iv(U.info.loc,X)}else if(U.spec.pass!=null){let X=W.get(U.spec.pass),re=X?dt(T,X,U.spec.buffer):null;re&&b.uniform1i(U.info.loc,B(R.get(re.texId),!1))}else if(U.wrap){b.uniform1i(U.info.loc,B(R.get(U.wrap.texId),!!U.wrap.cubemap)),U.wrap.getTime&&ae(U.name+"_time",U.wrap.getTime());let X=H[U.name+"_resolution"];X&&b.uniform2f(X.loc,U.wrap.width,U.wrap.height)}}Er(b,H,f,{strict:!1}),Er(b,H,V.uniforms,{strict:y,warnMissing:E,label:T.name}),se.bind(K),se.draw()}function Le(T,{advance:O=ie,rawDt:$}={}){let V=performance.now();if($===void 0&&($=Math.max(0,(T-pe)*.001)),pe=T,$>.002&&$<.1&&(et.push($),et.length>30&&et.shift(),et.length>=10)){let w=[...et].sort((G,ne)=>G-ne);Ft=Math.round(1/w[w.length>>1])}let K=Be>0?Be:Math.min($,Ne);O?(ke+=K*ze,qe>0&&(ke=(ke%qe+qe)%qe)):K=0,xe++;let H=$>0?1/$:0;ee.update(T),oe.update();let J={time:ke,frame:xe,dt:K,fps:H};F("beforeFrame",J),r.onFrame&&r.onFrame(J);let ae=new Date,ye={time:ke,frame:xe,dt:K,fps:H,dpr:window.devicePixelRatio||1,date:[ae.getFullYear(),ae.getMonth()+1,ae.getDate(),ae.getHours()*3600+ae.getMinutes()*60+ae.getSeconds()+ae.getMilliseconds()/1e3],scrollX:window.scrollX||0,scrollY:window.scrollY||0,refreshRate:Ft};Me&&Me.update($);for(let w of ue){for(let G of w.texChannels)G&&G.update&&G.update();for(let G of w.samplers)G.wrap&&G.wrap.update&&G.wrap.update()}for(let w of ue){let G=Math.max(1,w.cfg.iterations|0);for(let ne=0;ne<G;ne++)je(w,ye,ne);w.cfg.screen&&Ae&&Ye&&Ye.draw(R.get(w.target.texId),x.width,x.height)}b.bindFramebuffer(b.FRAMEBUFFER,null),F("afterFrame",J),we&&we.update({rawDt:$,cpuMs:performance.now()-V,frame:xe,time:ke,width:x.width,height:x.height,passes:ue.length})}function rt(T){if(le=requestAnimationFrame(rt),!ce||!Ct){pe=T;return}if(!ie&&ee.size===0&&r.renderWhilePaused!==!0){pe=T;return}lt>0&&T-ge<1e3/lt-.5||(ge=T,Le(T))}function $e(){!ce||be||Le(performance.now(),{advance:!1,rawDt:0})}function Ze(){be||le!=null||(pe=performance.now(),le=requestAnimationFrame(rt))}function At(){le!=null&&cancelAnimationFrame(le),le=null}function He(){be||(be=!0,At(),me(),oe.dispose(),ht.dispose(),ee.cancel(),we&&we.dispose(),te&&te.dispose(),Me&&Me.dispose(),Ye&&Ye.dispose(),x.removeEventListener("webglcontextlost",Pt),x.removeEventListener("webglcontextrestored",$t),_t(),se.dispose(),F("destroy"),D.clear(),!S&&x.parentNode&&x.parentNode.removeChild(x))}function _t(){for(let T of ue)R.unref(T.programId),Pn(R,T.target),Pn(R,T.targetPrev),T.texChannels.forEach(O=>{O&&(O.dispose&&O.dispose(),R.unref(O.texId))}),(T.samplers||[]).forEach(O=>{O.wrap&&(O.wrap.dispose&&O.wrap.dispose(),R.unref(O.wrap.texId))});ue.length=0,W.clear()}function Pt(T){T.preventDefault(),At(),ce=!1,console.warn("[ShaderMate] WebGL context lost."),F("contextlost")}async function $t(){console.warn("[ShaderMate] WebGL context restored, rebuilding."),R._items.clear(),ue.length=0,W.clear();try{await Ge(),ce=!0,Ze(),F("contextrestored")}catch(T){Fe(T)}}x.addEventListener("webglcontextlost",Pt),x.addEventListener("webglcontextrestored",$t);let it=ms(x,$e);function Je(T,O,$){if(T&&typeof T=="object"){for(let K in T)Je(K,T[K],O);return ve}ee.cancel(T);let V=!1;for(let K of ue)$&&K.name!==$||T in K.cfg.uniforms&&(Ln(K.cfg.uniforms,T,O),V=!0);if(!V)if($){let K=W.get($);if(!K)throw new Se(`set: unknown pass "${$}"`);Ln(K.cfg.uniforms,T,O)}else Ln(f,T,O);return!ie&&ce&&Re(),ve}function bt(T,O){for(let $ of ue)if(!(O&&$.name!==O)&&T in $.cfg.uniforms)return so($.cfg.uniforms,T);return so(f,T)}function Kt(T,O,$={}){let V=$.pass,K=()=>{for(let H of ue)if((!V||H.name===V)&&T in H.cfg.uniforms)return H.cfg.uniforms;return f};return ee.tween(T,()=>so(K(),T),H=>Ln(K(),T,H),O,$)}let yt=!1;function Re(){yt||(yt=!0,requestAnimationFrame(()=>{yt=!1,ie||$e()}))}async function zt(T,O){let $=O?W.get(O):ue.find(V=>V.cfg.screen)||ue[0];if(!$)throw new Se(`setShader: unknown pass "${O}"`);try{let{program:V,source:K,compiled:H}=await nt($.cfg,T,Y);if(be){b.deleteProgram(V);return}R.unref($.programId),$.programId=R.add(V,"program"),$.uniformInfo=hr(b,V),$.cfg.src=T,$.source=K,$.compiled=H,await gt($),mt(),F("shader",{pass:$.name}),ie||Re()}catch(V){throw Fe(V),V}}async function Zt(T,O,$){let V=$?W.get($):ue.find(J=>J.cfg.screen)||ue[0];if(!V)throw new Se(`setChannel: unknown pass "${$}"`);let K=Cr(O,[...W.keys()],V.name),H=V.texChannels[T];H&&(H.dispose&&H.dispose(),R.unref(H.texId),V.texChannels[T]=null),V.cfg.channels[T]=K,K&&K.pass==null&&(V.texChannels[T]=await io(b,R,K,P)),ie||Re()}let ve={version:Ji,canvas:x,gl:b,isWebGL2:_,theme:r.theme,get camera(){return Me},uniforms:f,get passes(){return ue},get ready(){return Bt},get loaded(){return ce},get error(){return De},play(){return ie||(ie=!0,pe=performance.now(),F("play")),ve},pause(){return ie&&(ie=!1,F("pause")),ve},toggle(){return ie?ve.pause():ve.play()},get playing(){return ie},step(T=1){for(let O=0;O<T;O++)Le(performance.now(),{advance:!0,rawDt:Be||1/60});return ve},render:$e,destroy:He,dispose:He,get time(){return ke},set time(T){ke=T,ie||Re()},get frame(){return xe},get timeScale(){return ze},set timeScale(T){ze=T},get maxFps(){return lt},set maxFps(T){lt=T||0},get loop(){return qe},set loop(T){qe=T||0},seek(T){return ke=T,ie||Re(),ve},setFixedDelta(T){return Be=T||0,ve},set:Je,get:bt,tween:Kt,setUniform:Je,getUniform:bt,setShader:zt,setChannel:Zt,getPass:T=>W.get(T)||null,getTexture(T){let O=T?W.get(T):ue.find($=>!$.cfg.screen)||ue[0];return O&&O.target?R.get(O.target.texId):null},readPixels({pass:T,x:O=0,y:$=0,width:V,height:K,float:H}={}){let J=T?W.get(T):null;$e(),J&&J.target?b.bindFramebuffer(b.FRAMEBUFFER,R.get(J.target.fboId)):b.bindFramebuffer(b.FRAMEBUFFER,null);let ae=V??(J&&J.target?J.target.width:x.width),ye=K??(J&&J.target?J.target.height:x.height),w=new Uint8Array(ae*ye*4);if(J&&J.target&&J.target.fmt.type!==b.UNSIGNED_BYTE){let ne=new Float32Array(ae*ye*4);if(b.readPixels(O,$,ae,ye,b.RGBA,b.FLOAT,ne),H!==!1)w=ne;else for(let d=0;d<ne.length;d++)w[d]=Math.max(0,Math.min(255,Math.round(ne[d]*255)))}else b.readPixels(O,$,ae,ye,b.RGBA,b.UNSIGNED_BYTE,w);return b.bindFramebuffer(b.FRAMEBUFFER,null),{data:w,width:ae,height:ye,float:w instanceof Float32Array}},resize:ot,setSize(T,O){return de.setFixed(T,O),ot(),ve},get width(){return x.width},get height(){return x.height},pointer:oe.state,domToShader:oe.toShader,domToUV:oe.toUV,screenshot:it.screenshot,toBlob:it.toBlob,download:it.download,record:it.record,on:I,off:N,once:z,stats:{show:(T=!0)=>{we||(we=kr({visible:!1,key:r.statsKey===void 0?"F1":r.statsKey,theme:r.theme})),we.show(T)},toggle:()=>ve.stats.show(!(we&&we.isVisible()))}};de.update(),b.viewport(0,0,x.width,x.height),me=de.observe(ot);let Bt=(async()=>(await Ge(),be||(ce=!0,mt(),F("load",ve),r.onReady&&r.onReady(ve),Ze(),ie||$e()),ve))();return Bt.catch(T=>{be||Fe(T)}),ve}var Ir=`
78
+ `+K:K,le=await Za(te,{loader:Fe}),Ae=d==="fragcoord"||d==="auto"&&Ya(le),ye=[],we=B.filter(X=>!X.screen);B.forEach(X=>ye.push("u_"+X.name)),we.forEach((X,ue)=>{let Me="u_pass"+(ue+1);ye.includes(Me)||ye.push(Me)});let Te=es(le,{isGL2:A,defines:[...l,...Mr(C.defines)],enableDerivatives:H,inject:c,channelTypes:C.channels.map(ds),builtinOpts:{fragcoord:Ae,mouseVec4:Ae||d==="fragcoord"||ms(le),scrollFloat:Ae||d==="fragcoord",samplerNames:ye,passCount:we.length}}),E=Br(y,A?Nr:Gr,Te,{label:C.name,showExpandedOnError:v});if(E.error)throw E.error;return{program:E.program,source:K,compiled:Te,fragcoord:Ae}}function kt(){for(let C of me){let U=C.cfg;if(U.screen&&!qe)continue;let[B,K]=U.screen?[x.width,x.height]:Ha(U.size,x.width,x.height);C.target&&C.target.width===B&&C.target.height===K||($n(I,C.target),$n(I,C.targetPrev),C.target=_r(y,I,B,K,U,A,_),C.targetPrev=U.pingpong||U.screen&&qe?_r(y,I,B,K,U,A,_):null)}}function yt(){Ce||ke.update()&&(y.viewport(0,0,x.width,x.height),kt(),D("resize",{width:x.width,height:x.height}),!Re&&xe&&lt())}async function He(C){await Promise.all(C.cfg.channels.map(async(U,B)=>{if(!(!U||U.pass!=null))try{C.texChannels[B]=await go(y,I,U,P)}catch(K){console.warn(`[ShaderMate] Pass "${C.name}" channel ${B}: ${K.message}`),D("error",K)}})),C.samplers=xs(C,me,h),await Promise.all(C.samplers.map(async U=>{if(!(U.spec.pass!=null||U.spec.array))try{U.wrap=await go(y,I,U.spec,P)}catch(B){console.warn(`[ShaderMate] Pass "${C.name}" sampler ${U.name}: ${B.message}`),D("error",B)}}))}function It(C){if(typeof C!="string"||!mo(C))return C;let U=fs(C);if(!U)return C;U.common&&(s=s?s+`
79
+ `+U.common:U.common);let B=U.passes.find(re=>re.bufferType!=="2d");if(B)throw new et(`Pass "${B.label}" uses a ${B.bufferType} buffer; ShaderMate supports 2D buffers only.`);let K=U.passes.map(re=>re.main?{name:"main",shader:re.src,screen:!0}:{name:re.name,shader:re.src,pingpong:!0,float:!0});return K.some(re=>re.screen)||(K[K.length-1].screen=!0),K}async function De(){V=Sa(It(r.passes));for(let C of V)C.iterations>1&&!C.screen&&(C.pingpong=!0);for(let C=0;C<V.length;C++){let U=V[C],{program:B,source:K,compiled:re,fragcoord:j}=await bt(U,U.src);if(Ce){y.deleteProgram(B);return}let te={cfg:U,name:U.name,index:C,programId:I.add(B,"program"),uniformInfo:Ar(y,B),source:K,compiled:re,fragcoord:j,target:null,targetPrev:null,texChannels:new Array(gn).fill(null),samplers:[]};me.push(te),W.set(te.name,te)}await Promise.all(me.map(He)),!Ce&&(qe=ws(me),qe&&!We&&(We=Ba(y,A,ve)),!Ue&&me.some(C=>C.uniformInfo.u_camera_pos||C.uniformInfo.u_camera_dir||C.uniformInfo.u_camera_view)&&(Ue=vs(x,typeof r.camera=="object"?r.camera:{})),kt())}function $e(C,U,B){let K=null;return U.targetPrev?K=B==="prev"||B!=="current"&&U.index>=C.index?U.targetPrev:U.target:U===C?Zt("self:"+C.name,`Pass "${C.name}" reads its own output; add pingpong: true.`):U.cfg.screen?Zt("screen:"+U.name,`Pass "${C.name}" can't read screen pass "${U.name}" (it has no texture).`):K=U.target,K}function ct(C,U,B=0){let K=C.cfg,re=I.get(C.programId),j=C.uniformInfo,te=fe.state,le=(J,u)=>{let g=j[J];g&&y.uniform1f(g.loc,u)},Ae=(J,u)=>{let g=j[J];g&&y.uniform1i(g.loc,u)};if(C.targetPrev){let J=C.targetPrev;C.targetPrev=C.target,C.target=J}let ye,we;K.screen&&!qe?(y.bindFramebuffer(y.FRAMEBUFFER,null),ye=x.width,we=x.height):(y.bindFramebuffer(y.FRAMEBUFFER,I.get(C.target.fboId)),ye=C.target.width,we=C.target.height);let Te=K.screen?1:ye/x.width,E=K.screen?1:we/x.height;if(y.viewport(0,0,ye,we),y.useProgram(re),y.clear(y.COLOR_BUFFER_BIT|(C.target&&C.target.depthId?y.DEPTH_BUFFER_BIT:0)),le("iTime",U.time),le("u_time",U.time),le("iTimeDelta",U.dt),le("u_delta",U.dt),le("u_time_delta",U.dt),Ae("iFrame",U.frame),Ae("u_frame",U.frame),le("iFrameRate",U.fps),le("u_fps",U.fps),le("u_refresh_rate",U.refreshRate),le("iSampleRate",44100),j.iResolution&&y.uniform3f(j.iResolution.loc,ye,we,1),j.u_resolution&&y.uniform2f(j.u_resolution.loc,ye,we),le("u_aspect",ye/we),le("u_pixelRatio",U.dpr),j.iDate&&y.uniform4fv(j.iDate.loc,U.date),j.u_date&&y.uniform4fv(j.u_date.loc,U.date),j.iScroll&&y.uniform2f(j.iScroll.loc,U.scrollX,U.scrollY),j.u_scroll&&(j.u_scroll.type===Ss?y.uniform1f(j.u_scroll.loc,te.wheel):y.uniform2f(j.u_scroll.loc,U.scrollX,U.scrollY)),le("u_wheel",te.wheel),j.u_drag&&y.uniform2f(j.u_drag.loc,te.dragX*Te,te.dragY*E),Ae("u_recursion",B),Ae("u_max_recursion",K.iterations||1),Ae("u_color_gamut",0),Ue&&(j.u_camera_pos&&y.uniform3fv(j.u_camera_pos.loc,Ue.pos),j.u_camera_dir&&y.uniform3fv(j.u_camera_dir.loc,Ue.dir),j.u_camera_view&&y.uniformMatrix4fv(j.u_camera_view.loc,!1,Ue.view)),j.iMouse){let J=te.down?1:-1,u=te.clicked?1:-1;y.uniform4f(j.iMouse.loc,te.x*Te,te.y*E,te.clickX*Te*J,te.clickY*E*u)}if(j.u_mouse)if(j.u_mouse.type===Ur){let J=te.down?1:-1;y.uniform4f(j.u_mouse.loc,te.x*Te,te.y*E,te.clickX*Te*J,te.clickY*E*J)}else y.uniform2f(j.u_mouse.loc,te.x*Te,te.y*E);j.u_mouseUV&&y.uniform2f(j.u_mouseUV.loc,te.uvX,te.uvY),le("u_mouseDown",te.down?1:0);let X=[0,0,0,0],ue=new Float32Array(12);for(let J=0;J<gn;J++){let u=K.channels[J];if(!u)continue;let g=null,S=0,R=0,q=!1,Z=U.time;if(u.pass!=null){let ne=W.get(u.pass),Ee=ne?$e(C,ne,u.buffer):null;Ee&&(g=I.get(Ee.texId),S=Ee.width,R=Ee.height)}else{let ne=C.texChannels[J];ne&&(g=I.get(ne.texId),S=ne.width,R=ne.height,q=!!ne.cubemap,ne.getTime&&(Z=ne.getTime()))}g&&(y.activeTexture(y.TEXTURE0+J),y.bindTexture(q?y.TEXTURE_CUBE_MAP:y.TEXTURE_2D,g),Ae("iChannel"+J,J),X[J]=Z,ue[J*3]=S,ue[J*3+1]=R,ue[J*3+2]=1)}j.iChannelTime&&(j.iChannelTime.type===Ur?y.uniform4fv:y.uniform1fv).call(y,j.iChannelTime.loc,X),j.iChannelResolution&&y.uniform3fv(j.iChannelResolution.loc,ue);let Me=gn;for(let J of C.samplers){let u=(g,S)=>(y.activeTexture(y.TEXTURE0+Me),y.bindTexture(S?y.TEXTURE_CUBE_MAP:y.TEXTURE_2D,g),Me++);if(J.spec.array){let g=J.spec.array.map(S=>{let R=$e(C,S,J.spec.buffer);return R?u(I.get(R.texId),!1):0});y.uniform1iv(J.info.loc,g)}else if(J.spec.pass!=null){let g=W.get(J.spec.pass),S=g?$e(C,g,J.spec.buffer):null;S&&y.uniform1i(J.info.loc,u(I.get(S.texId),!1))}else if(J.wrap){y.uniform1i(J.info.loc,u(I.get(J.wrap.texId),!!J.wrap.cubemap)),J.wrap.getTime&&le(J.name+"_time",J.wrap.getTime());let g=j[J.name+"_resolution"];g&&y.uniform2f(g.loc,J.wrap.width,J.wrap.height)}}Or(y,j,f,{strict:!1}),Or(y,j,K.uniforms,{strict:b,warnMissing:M,label:C.name}),ve.bind(re),ve.draw()}function Qe(C,{advance:U=Re,rawDt:B}={}){let K=performance.now();if(B===void 0&&(B=Math.max(0,(C-be)*.001)),be=C,B>.002&&B<.1&&(rt.push(B),rt.length>30&&rt.shift(),rt.length>=10)){let ye=[...rt].sort((we,Te)=>we-Te);St=Math.round(1/ye[ye.length>>1])}let re=ce>0?ce:Math.min(B,Oe);U?(Ie+=re*Ze,nt>0&&(Ie=(Ie%nt+nt)%nt)):re=0,Se++;let j=B>0?1/B:0;se.update(C),fe.update();let te={time:Ie,frame:Se,dt:re,fps:j};D("beforeFrame",te),r.onFrame&&r.onFrame(te);let le=new Date,Ae={time:Ie,frame:Se,dt:re,fps:j,dpr:window.devicePixelRatio||1,date:[le.getFullYear(),le.getMonth()+1,le.getDate(),le.getHours()*3600+le.getMinutes()*60+le.getSeconds()+le.getMilliseconds()/1e3],scrollX:window.scrollX||0,scrollY:window.scrollY||0,refreshRate:St};Ue&&Ue.update(B);for(let ye of me){for(let we of ye.texChannels)we&&we.update&&we.update();for(let we of ye.samplers)we.wrap&&we.wrap.update&&we.wrap.update()}for(let ye of me){let we=Math.max(1,ye.cfg.iterations|0);for(let Te=0;Te<we;Te++)ct(ye,Ae,Te);ye.cfg.screen&&qe&&We&&We.draw(I.get(ye.target.texId),x.width,x.height)}y.bindFramebuffer(y.FRAMEBUFFER,null),D("afterFrame",te),ze&&ze.update({rawDt:B,cpuMs:performance.now()-K,frame:Se,time:Ie,width:x.width,height:x.height,passes:me.length})}function je(C){if(z=requestAnimationFrame(je),!xe||!Ye){be=C;return}if(!Re&&se.size===0&&r.renderWhilePaused!==!0){be=C;return}Je>0&&C-pe<1e3/Je-.5||(pe=C,Qe(C))}function lt(){!xe||Ce||Qe(performance.now(),{advance:!1,rawDt:0})}function Ve(){Ce||z!=null||(be=performance.now(),z=requestAnimationFrame(je))}function Ne(){z!=null&&cancelAnimationFrame(z),z=null}function it(){Ce||(Ce=!0,Ne(),ge(),fe.dispose(),Et.dispose(),se.cancel(),ze&&ze.dispose(),de&&de.dispose(),Ue&&Ue.dispose(),We&&We.dispose(),x.removeEventListener("webglcontextlost",Ct),x.removeEventListener("webglcontextrestored",Lt),xt(),ve.dispose(),D("destroy"),O.clear(),!w&&x.parentNode&&x.parentNode.removeChild(x))}function xt(){for(let C of me)I.unref(C.programId),$n(I,C.target),$n(I,C.targetPrev),C.texChannels.forEach(U=>{U&&(U.dispose&&U.dispose(),I.unref(U.texId))}),(C.samplers||[]).forEach(U=>{U.wrap&&(U.wrap.dispose&&U.wrap.dispose(),I.unref(U.wrap.texId))});me.length=0,W.clear()}function Ct(C){C.preventDefault(),Ne(),xe=!1,console.warn("[ShaderMate] WebGL context lost."),D("contextlost")}async function Lt(){console.warn("[ShaderMate] WebGL context restored, rebuilding."),I._items.clear(),me.length=0,W.clear();try{await De(),xe=!0,Ve(),D("contextrestored")}catch(C){mt(C)}}x.addEventListener("webglcontextlost",Ct),x.addEventListener("webglcontextrestored",Lt);let ut=Us(x,lt);function Ke(C,U,B){if(C&&typeof C=="object"){for(let re in C)Ke(re,C[re],U);return ae}se.cancel(C);let K=!1;for(let re of me)B&&re.name!==B||C in re.cfg.uniforms&&(zn(re.cfg.uniforms,C,U),K=!0);if(!K)if(B){let re=W.get(B);if(!re)throw new et(`set: unknown pass "${B}"`);zn(re.cfg.uniforms,C,U)}else zn(f,C,U);return!Re&&xe&&Y(),ae}function dt(C,U){for(let B of me)if(!(U&&B.name!==U)&&C in B.cfg.uniforms)return yo(B.cfg.uniforms,C);return yo(f,C)}function L(C,U,B={}){let K=B.pass,re=()=>{for(let j of me)if((!K||j.name===K)&&C in j.cfg.uniforms)return j.cfg.uniforms;return f};return se.tween(C,()=>yo(re(),C),j=>zn(re(),C,j),U,B)}let $=!1;function Y(){$||($=!0,requestAnimationFrame(()=>{$=!1,Re||lt()}))}async function oe(C,U){let B=U?W.get(U):me.find(K=>K.cfg.screen)||me[0];if(!B)throw new et(`setShader: unknown pass "${U}"`);try{let{program:K,source:re,compiled:j}=await bt(B.cfg,C,V);if(Ce){y.deleteProgram(K);return}I.unref(B.programId),B.programId=I.add(K,"program"),B.uniformInfo=Ar(y,K),B.cfg.src=C,B.source=re,B.compiled=j,await He(B),Be(),D("shader",{pass:B.name}),Re||Y()}catch(K){throw mt(K),K}}async function he(C,U,B){let K=B?W.get(B):me.find(te=>te.cfg.screen)||me[0];if(!K)throw new et(`setChannel: unknown pass "${B}"`);let re=zr(U,[...W.keys()],K.name),j=K.texChannels[C];j&&(j.dispose&&j.dispose(),I.unref(j.texId),K.texChannels[C]=null),K.cfg.channels[C]=re,re&&re.pass==null&&(K.texChannels[C]=await go(y,I,re,P)),Re||Y()}let ae={version:ba,canvas:x,gl:y,isWebGL2:A,theme:r.theme,get camera(){return Ue},uniforms:f,get passes(){return me},get ready(){return Le},get loaded(){return xe},get error(){return ot},play(){return Re||(Re=!0,be=performance.now(),D("play")),ae},pause(){return Re&&(Re=!1,D("pause")),ae},toggle(){return Re?ae.pause():ae.play()},get playing(){return Re},step(C=1){for(let U=0;U<C;U++)Qe(performance.now(),{advance:!0,rawDt:ce||1/60});return ae},render:lt,destroy:it,dispose:it,get time(){return Ie},set time(C){Ie=C,Re||Y()},get frame(){return Se},get timeScale(){return Ze},set timeScale(C){Ze=C},get maxFps(){return Je},set maxFps(C){Je=C||0},get loop(){return nt},set loop(C){nt=C||0},seek(C){return Ie=C,Re||Y(),ae},setFixedDelta(C){return ce=C||0,ae},set:Ke,get:dt,tween:L,setUniform:Ke,getUniform:dt,setShader:oe,setChannel:he,getPass:C=>W.get(C)||null,getTexture(C){let U=C?W.get(C):me.find(B=>!B.cfg.screen)||me[0];return U&&U.target?I.get(U.target.texId):null},readPixels({pass:C,x:U=0,y:B=0,width:K,height:re,float:j}={}){let te=C?W.get(C):null;lt(),te&&te.target?y.bindFramebuffer(y.FRAMEBUFFER,I.get(te.target.fboId)):y.bindFramebuffer(y.FRAMEBUFFER,null);let le=K??(te&&te.target?te.target.width:x.width),Ae=re??(te&&te.target?te.target.height:x.height),ye=new Uint8Array(le*Ae*4);if(te&&te.target&&te.target.fmt.type!==y.UNSIGNED_BYTE){let Te=new Float32Array(le*Ae*4);if(y.readPixels(U,B,le,Ae,y.RGBA,y.FLOAT,Te),j!==!1)ye=Te;else for(let E=0;E<Te.length;E++)ye[E]=Math.max(0,Math.min(255,Math.round(Te[E]*255)))}else y.readPixels(U,B,le,Ae,y.RGBA,y.UNSIGNED_BYTE,ye);return y.bindFramebuffer(y.FRAMEBUFFER,null),{data:ye,width:le,height:Ae,float:ye instanceof Float32Array}},resize:yt,setSize(C,U){return ke.setFixed(C,U),yt(),ae},get width(){return x.width},get height(){return x.height},pointer:fe.state,domToShader:fe.toShader,domToUV:fe.toUV,screenshot:ut.screenshot,toBlob:ut.toBlob,download:ut.download,record:ut.record,on:F,off:G,once:N,stats:{show:(C=!0)=>{ze||(ze=Dr({visible:!1,key:r.statsKey===void 0?"F1":r.statsKey,theme:r.theme})),ze.show(C)},toggle:()=>ae.stats.show(!(ze&&ze.isVisible()))}};ke.update(),y.viewport(0,0,x.width,x.height),ge=ke.observe(yt);let Le=(async()=>(await De(),Ce||(xe=!0,Be(),D("load",ae),r.onReady&&r.onReady(ae),Ve(),Re||lt()),ae))();return Le.catch(C=>{Ce||mt(C)}),ae}var qr=`
80
80
  // 256\xD71, palette colours in x = 0..count-1
81
81
  uniform sampler2D u_palette;
82
82
  uniform int u_count;
@@ -116,7 +116,7 @@ int colorKey(vec4 c) {
116
116
  ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));
117
117
  return b.r * 65536 + b.g * 256 + b.b;
118
118
  }
119
- `,Or=`
119
+ `,Yr=`
120
120
  // 0 box, 1 nearest
121
121
  uniform int u_resample;
122
122
  // brightness, contrast, saturation, gamma
@@ -166,7 +166,7 @@ void main() {
166
166
  a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;
167
167
  fragColor = vec4(c * a, a);
168
168
  }
169
- `,Dr=`
169
+ `,Kr=`
170
170
  // threshold bytes in .r
171
171
  uniform sampler2D u_matrix;
172
172
  // 0 pass-through, 1 nearest, 2 ordered
@@ -189,7 +189,7 @@ void main() {
189
189
  }
190
190
  fragColor = vec4(palColor(nearestIndex(c)), 1.0);
191
191
  }
192
- `,Fr=`
192
+ `,Zr=`
193
193
  // iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)
194
194
  uniform int u_recursion;
195
195
  uniform int u_on;
@@ -220,7 +220,7 @@ void main() {
220
220
  int idx = nearestIndex(c);
221
221
  fragColor = vec4(c - palColor(idx), float(idx));
222
222
  }
223
- `,$r=`
223
+ `,Jr=`
224
224
  uniform int u_on;
225
225
  void main() {
226
226
  ivec2 P = topDown();
@@ -228,7 +228,7 @@ void main() {
228
228
  vec4 d = at(iChannel1, P);
229
229
  fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);
230
230
  }
231
- `,zr=`
231
+ `,Qr=`
232
232
  uniform int u_on;
233
233
  void main() {
234
234
  ivec2 P = topDown();
@@ -255,7 +255,7 @@ void main() {
255
255
  }
256
256
  fragColor = cs[best];
257
257
  }
258
- `,Br=`
258
+ `,ei=`
259
259
  uniform int u_on;
260
260
  void main() {
261
261
  ivec2 P = topDown();
@@ -276,7 +276,7 @@ void main() {
276
276
  if (m >= 5) { fragColor = cs[i]; return; }
277
277
  }
278
278
  }
279
- `,Nr=`
279
+ `,ti=`
280
280
  // 0 none, 1 outer, 2 inner
281
281
  uniform int u_outline;
282
282
  uniform int u_corners;
@@ -298,11 +298,11 @@ void main() {
298
298
  if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }
299
299
  }
300
300
  }
301
- `;var un=(e,t)=>{let n=document.createElement("canvas");return n.width=e,n.height=t,n};async function Gr(){if(typeof document>"u")throw new Error("No DOM");let e=un(1,1).getContext("webgl2");if(!e)throw new Error("WebGL 2 is not available");if(!e.getExtension("EXT_color_buffer_float"))throw new Error("Float render targets are not available");let t=e.getExtension("WEBGL_debug_renderer_info"),n=String(t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER));e.getExtension("WEBGL_lose_context")?.loseContext();let o=un(1,1),i=un(1,1),r=un(256,1),a=un(1,1),c=x=>({element:x,filter:"nearest",wrap:"clamp"}),u=Ur({canvas:o,webgl:2,size:[1,1],pixelRatio:1,autoplay:!1,pauseWhenHidden:!1,pointer:!1,errorOverlay:!1,warnMissingUniforms:!1,preserveDrawingBuffer:!0,premultipliedAlpha:!1,antialias:!1,dialect:"shadermate",common:Ir,samplers:{u_palette:c(r),u_matrix:c(a)},uniforms:{u_count:1,u_distance:0,u_resample:0,u_adjust:[0,0,0,1],u_hue:0,u_crop:[0,0,1,1],u_alphaCut:.5,u_mode:0,u_levels:1,u_amount:0,u_skew:1,u_strength:1,u_kn:0,u_kernel:new Float32Array(no*3),u_outline:0,u_corners:0,u_outlineColor:[0,0,0]},passes:[{name:"prep",shader:Or,float:"full",filter:"nearest",channels:[{...c(i),dynamic:!1}]},{name:"quant",shader:Dr,filter:"nearest",channels:["prep"]},{name:"diffuse",shader:Fr,float:"full",filter:"nearest",pingpong:!0,iterations:2,channels:["prep","diffuse"]},{name:"resolve",shader:$r,filter:"nearest",channels:["quant","diffuse"]},{name:"orphan",shader:zr,filter:"nearest",channels:["resolve"]},{name:"smooth",shader:Br,filter:"nearest",channels:["orphan"]},{name:"out",shader:Nr,screen:!0,channels:["smooth"]}]}),s=null;if(u.on("error",x=>{s=x}),await u.ready,s||u.error)throw u.destroy(),s||u.error;let l=(x,S)=>{for(let b in S)u.set(b,S[b],x)},p=null,f="",h="";async function y(x){if(x.canvas===p&&!x.dirty)return;i.width=x.width,i.height=x.height;let S=i.getContext("2d");S.clearRect(0,0,i.width,i.height),S.drawImage(x.canvas,0,0),await u.setChannel(0,{...c(i),dynamic:!1},"prep"),p=x.canvas}function E(x){let S=x.palette.map(L=>L.join(",")).join(";");if(S===f)return;f=S;let b=r.getContext("2d"),_=b.createImageData(256,1);x.palette.forEach((L,P)=>_.data.set([L[0],L[1],L[2],255],P*4)),b.putImageData(_,0,0)}function v(x){let S=x?`${x.w}x${x.h}:${x.levels}:${x.values.join(",")}`:"none";if(S===h)return;h=S;let b=x||{w:1,h:1,values:[0]};a.width=b.w,a.height=b.h;let _=a.getContext("2d"),L=_.createImageData(b.w,b.h);for(let P=0;P<b.values.length;P++)L.data.set([b.values[P],0,0,255],P*4);_.putImageData(L,0,0)}async function M(x,S){let b=x.settings;await y(S),x.quantize&&E(x),v(x.map),(u.width!==x.width||u.height!==x.height)&&u.setSize(x.width,x.height);let _=x.kind==="diffusion",L=new Array(no).fill(null).map((F,I)=>x.kernel&&x.kernel[I]||[0,0,0]);u.set({u_count:x.palette.length||1,u_distance:x.distance,u_resample:b.size.resample==="nearest"?1:0,u_adjust:[b.adjust.brightness,b.adjust.contrast,b.adjust.saturation,b.adjust.gamma],u_hue:b.adjust.hue,u_crop:[x.crop.x,x.crop.y,x.crop.w,x.crop.h],u_alphaCut:b.alpha.threshold,u_mode:x.quantize?x.kind==="ordered"?2:1:0,u_levels:x.map?x.map.levels:1,u_amount:x.map?x.spread*b.dither.strength:0,u_skew:x.skew,u_strength:b.dither.strength,u_kn:x.kernel?x.kernel.length:0,u_kernel:new Float32Array(L.flat()),u_outline:{none:0,outer:1,inner:2}[x.outline.mode],u_corners:x.outline.corners?1:0,u_outlineColor:x.outline.color.map(F=>F/255)}),l("diffuse",{u_on:_?1:0}),l("resolve",{u_on:_?1:0}),l("orphan",{u_on:b.cleanup.orphans?1:0}),l("smooth",{u_on:b.cleanup.smooth?1:0}),u.getPass("diffuse").cfg.iterations=_?x.waves:1;let{data:P}=u.readPixels(),R=x.width,j=x.height,C=new Uint8ClampedArray(R*j*4),D=R*4;for(let F=0;F<j;F++)C.set(P.subarray((j-1-F)*D,(j-F)*D),F*D);return C}return{name:"webgl",renderer:n,software:/swiftshader|llvmpipe|softpipe|software|basic render/i.test(n),run:M,shader:u,destroy(){u.destroy()}}}var ho=typeof document<"u",jr=e=>e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e&&e.data&&e.data.length===e.width*e.height*4;async function ys(e){if(typeof Blob<"u"&&e instanceof Blob){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e)}catch{}e=URL.createObjectURL(e)}if(!ho)throw new Error("Loading images by URL needs a browser; pass { width, height, data } in Node.");let t=new Image;return t.crossOrigin="anonymous",t.decoding="async",t.src=e,await t.decode(),t}function xs(e){return{width:e.naturalWidth||e.videoWidth||e.displayWidth||e.codedWidth||e.width||0,height:e.naturalHeight||e.videoHeight||e.displayHeight||e.codedHeight||e.height||0}}function ws(e){if(e&&!jr(e)&&typeof e=="object"){if(e.canvas&&typeof e.canvas=="object"&&"getContext"in e.canvas)return e.canvas;if(e.elt&&typeof e.elt=="object"&&"getContext"in e.elt)return e.elt}return e}async function Hr(e,t={}){let n=t.maxSize||4096,o=ws(e);if((typeof o=="string"||typeof Blob<"u"&&o instanceof Blob)&&(o=await ys(o)),o&&typeof o.complete=="boolean"&&!o.complete&&o.decode&&await o.decode(),jr(o)){let l={width:o.width,height:o.height,data:o.data,canvas:null};return ho&&Object.defineProperty(l,"canvas",{configurable:!0,get(){let p=document.createElement("canvas");p.width=o.width,p.height=o.height;let f=new ImageData(new Uint8ClampedArray(o.data),o.width,o.height);return p.getContext("2d").putImageData(f,0,0),Object.defineProperty(l,"canvas",{value:p}),p}}),l}if(!ho)throw new Error("Unsupported source in a non-browser environment. Pass { width, height, data }.");let{width:i,height:r}=xs(o);if(!i||!r)throw new Error("Source has no size yet (is the image or video loaded?)");let a=Math.min(1,n/Math.max(i,r));i=Math.max(1,Math.round(i*a)),r=Math.max(1,Math.round(r*a));let c=t.canvas||document.createElement("canvas");c.width=i,c.height=r;let u=c.getContext("2d",{willReadFrequently:!0});u.clearRect(0,0,i,r),u.imageSmoothingEnabled=a<1,u.imageSmoothingQuality="high",u.drawImage(o,0,0,i,r);let s=null;return{width:i,height:r,canvas:c,dirty:!0,get data(){return s||(s=u.getImageData(0,0,i,r).data)}}}Vt();Vt();function qr(e,t=1,n={}){let o=t>1||n.grid?Rt(e,t,n):e,i=n.canvas||document.createElement("canvas");return i.width=o.width,i.height=o.height,i.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(o.data),o.width,o.height),0,0),i}function We(e,t,n="application/octet-stream"){let o=e instanceof Blob?e:new Blob([e],{type:n}),i=URL.createObjectURL(o),r=document.createElement("a");r.href=i,r.download=t,r.rel="noopener",document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e4)}var Un=null;function In(e,t=0){if(!Un){Un=new Uint32Array(256);for(let n=0;n<256;n++){let o=n;for(let i=0;i<8;i++)o=o&1?3988292384^o>>>1:o>>>1;Un[n]=o>>>0}}t=~t>>>0;for(let n=0;n<e.length;n++)t=Un[(t^e[n])&255]^t>>>8;return~t>>>0}Vt();var vs=[137,80,78,71,13,10,26,10];async function Es(e){if(typeof CompressionStream=="function"){let n=new CompressionStream("deflate"),o=new Blob([e]).stream().pipeThrough(n);return new Uint8Array(await new Response(o).arrayBuffer())}let{deflateSync:t}=await import("node:zlib");return new Uint8Array(t(e))}function tn(e,t){let n=new Uint8Array(12+t.length),o=new DataView(n.buffer);o.setUint32(0,t.length);for(let i=0;i<4;i++)n[4+i]=e.charCodeAt(i);return n.set(t,8),o.setUint32(8+t.length,In(n.subarray(4,8+t.length))),n}function ks(e){let t=e.data,n=e.width*e.height,o=new Map,i=[],r=new Uint8Array(n);for(let a=0;a<n;a++){let c=a*4,u=t[c+3]===0?-1:(t[c]<<24|t[c+1]<<16|t[c+2]<<8|t[c+3])>>>0,s=o.get(u);if(s===void 0){if(i.length===256)return null;s=i.length,o.set(u,s),i.push(u===-1?[0,0,0,0]:[t[c],t[c+1],t[c+2],t[c+3]])}r[a]=s}return{colors:i,indices:r}}async function ft(e,t={}){t.width&&t.height?e=Vr(e,t.width,t.height):(t.scale&&t.scale>1||t.grid)&&(e=Rt(e,t.scale||1,t));let{width:n,height:o}=e,i=t.indexed===!1?null:ks(e),r=new Uint8Array(13),a=new DataView(r.buffer);a.setUint32(0,n),a.setUint32(4,o);let c=[new Uint8Array(vs)],u;if(i){let f=i.colors.length<=2?1:i.colors.length<=4?2:i.colors.length<=16?4:8;r.set([f,3,0,0,0],8);let h=Math.ceil(n*f/8);u=new Uint8Array((h+1)*o);for(let y=0;y<o;y++){let E=y*(h+1)+1;for(let v=0;v<n;v++){let M=i.indices[y*n+v],x=v*f;u[E+(x>>3)]|=M<<8-f-(x&7)}}if(c.push(tn("IHDR",r)),c.push(tn("PLTE",Uint8Array.from(i.colors.flatMap(y=>y.slice(0,3))))),i.colors.some(y=>y[3]<255)){let y=i.colors.length;for(;y>0&&i.colors[y-1][3]===255;)y--;c.push(tn("tRNS",Uint8Array.from(i.colors.slice(0,y).map(E=>E[3]))))}}else{r.set([8,6,0,0,0],8),u=new Uint8Array((n*4+1)*o);for(let f=0;f<o;f++)u.set(e.data.subarray?e.data.subarray(f*n*4,(f+1)*n*4):Array.prototype.slice.call(e.data,f*n*4,(f+1)*n*4),f*(n*4+1)+1);c.push(tn("IHDR",r))}c.push(tn("IDAT",await Es(u))),c.push(tn("IEND",new Uint8Array(0)));let s=c.reduce((f,h)=>f+h.length,0),l=new Uint8Array(s),p=0;for(let f of c)l.set(f,p),p+=f.length;return l}var Ms=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement,Cs=e=>typeof VideoFrame<"u"&&e instanceof VideoFrame;async function Yr(e={}){let t=e.backend||"auto",n=null,o=null;if(t!=="cpu"&&typeof document<"u")try{n=await Gr()}catch(s){if(o=s,t==="webgl")throw s}let i=typeof document<"u"?document.createElement("canvas"):null,r={source:null,frame:null},a=Promise.resolve();async function c(s){if(s===r.source&&r.frame&&!Ms(s)&&!Cs(s))return r.frame.dirty=!1,r.frame;let l=await Hr(s,{maxSize:e.maxSourceSize,canvas:i});return r={source:s,frame:l},l}async function u(s,l){let p=typeof performance<"u"?performance.now():Date.now(),f=await c(s),h=ar(l,f),y,E="cpu",v=h.kind==="diffusion"&&(e.diffusion==="cpu"||e.diffusion!=="gpu"&&n&&n.software);n&&f.canvas&&!v?(y=await n.run(h,f),E="webgl"):y=sr(h,f);let M=(typeof performance<"u"?performance.now():Date.now())-p;return Ss(h,y,E,M)}return{get backend(){return n?"webgl":"cpu"},get renderer(){return n?n.renderer:""},get fallbackReason(){return o?String(o.message||o):""},process(s,l={}){let p=a.then(()=>u(s,l));return a=p.catch(()=>{}),p},invalidate(){r={source:null,frame:null}},destroy(){n&&n.destroy(),n=null},get shader(){return n?n.shader:null}}}function Ss(e,t,n="cpu",o=0){return{width:e.width,height:e.height,data:t,palette:e.paletteHex?e.paletteHex.slice():null,settings:e.settings,kind:e.kind,waves:e.waves,crop:{x:e.crop.x/e.srcWidth,y:e.crop.y/e.srcHeight,w:e.crop.w/e.srcWidth,h:e.crop.h/e.srcHeight},backend:n,ms:o,usedColors(){return Xr(this)},toImageData(){return new ImageData(new Uint8ClampedArray(this.data),this.width,this.height)},toCanvas(r=1,a={}){return qr(this,r,a)},toPNG(r={}){return ft(this,r)},async toBlob(r={}){return new Blob([await ft(this,r)],{type:"image/png"})}}}bo();ti();Vt();vt();Fn();var dn=[{id:"balanced",name:"Balanced",description:"Endesga 32, Bayer 4\xD74. A good first look at most photos.",settings:{size:{width:96},palette:{source:"builtin",id:"endesga-32"},dither:{method:"bayer4",strength:.6}}},{id:"game-boy",name:"Game Boy",description:"Four greens, 160 px wide, ordered dither.",settings:{size:{width:160},palette:{source:"builtin",id:"game-boy-dmg"},dither:{method:"bayer4",strength:1},adjust:{contrast:.15}}},{id:"pico-8",name:"PICO-8",description:"128 px, the PICO-8 palette, blue-noise dither.",settings:{size:{width:128},palette:{source:"builtin",id:"pico-8"},dither:{method:"bluenoise",strength:.7}}},{id:"one-bit",name:"1-bit Atkinson",description:"Classic Mac look: two colours, Atkinson diffusion.",settings:{size:{width:192},palette:{source:"builtin",id:"1-bit-monitor"},dither:{method:"atkinson",strength:1},adjust:{contrast:.2}}},{id:"faithful",name:"Faithful colour",description:"Palette extracted from the image, Floyd\u2013Steinberg.",settings:{size:{width:128},palette:{source:"extract",count:24},dither:{method:"floyd-steinberg",strength:.75}}},{id:"sprite",name:"Clean sprite",description:"No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.",settings:{size:{width:48,resample:"nearest"},palette:{source:"extract",count:12},dither:{method:"none"},cleanup:{orphans:!0},outline:{mode:"outer",color:"#1a1c2c"}}},{id:"cga",name:"CGA",description:"16 hard colours with an 8\xD78 Bayer pattern.",settings:{size:{width:160},palette:{source:"builtin",id:"cga-16"},dither:{method:"bayer8",strength:1}}},{id:"newsprint",name:"Newsprint",description:"Grey clustered-dot halftone.",settings:{size:{width:220},palette:{source:"builtin",id:"grayscale-4"},dither:{method:"cluster8",strength:1},adjust:{saturation:-1}}},{id:"soft",name:"Soft painterly",description:"Resurrect 64 with Sierra Lite and a light smooth.",settings:{size:{width:112},palette:{source:"builtin",id:"resurrect-64"},dither:{method:"sierra-lite",strength:.6},cleanup:{smooth:!0}}}];function m(e,t={},...n){let[o,...i]=e.split("."),r=document.createElement(o||"div");i.length&&(r.className=i.join(" "));for(let[a,c]of Object.entries(t||{}))c==null||c===!1||(a.startsWith("on")&&typeof c=="function"?r.addEventListener(a.slice(2),c):a==="html"?r.innerHTML=c:a==="text"?r.textContent=c:a==="style"&&typeof c=="object"?Object.assign(r.style,c):a==="dataset"?Object.assign(r.dataset,c):a in r&&typeof c!="string"&&a!=="list"?r[a]=c:r.setAttribute(a,c===!0?"":c));return ai(r,n),r}function ai(e,t){for(let n of t.flat(1/0))n==null||n===!1||e.append(n instanceof Node?n:document.createTextNode(String(n)));return e}function st(e,...t){return e.replaceChildren(),ai(e,t)}var Is=0,fn=(e="itp")=>`${e}-${++Is}`;function $n({accept:e="",multiple:t=!1}={}){return new Promise(n=>{let o=m("input",{type:"file",accept:e,multiple:t,style:{display:"none"}});o.addEventListener("change",()=>{n([...o.files]),o.remove()}),o.addEventListener("cancel",()=>{n([]),o.remove()}),document.body.append(o),o.click()})}var si={upload:'<path d="M12 15V4m0 0-4 4m4-4 4 4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',download:'<path d="M12 4v11m0 0-4-4m4 4 4-4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',image:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><circle cx="9" cy="10" r="1.6"/><path d="m4 17 5-4.5 4 3.5 3-2.5 4 3.5"/>',film:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M7.5 4.5v15M16.5 4.5v15M3.5 9h4M3.5 15h4M16.5 9h4M16.5 15h4"/>',files:'<path d="M8 7V5.5A1.5 1.5 0 0 1 9.5 4H15l4 4v8.5a1.5 1.5 0 0 1-1.5 1.5H16"/><rect x="4.5" y="7" width="11.5" height="13" rx="1.5"/>',presets:'<rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><path d="M16.5 13.5v6M13.5 16.5h6"/>',palette:'<path d="M12 3.5a8.5 8.5 0 1 0 0 17c1.2 0 1.8-.9 1.4-2l-.3-.8c-.4-1.2.5-2.2 1.7-2.2h1.7a4 4 0 0 0 4-4c0-4.4-3.8-8-8.5-8Z"/><circle cx="8" cy="11" r="1"/><circle cx="11" cy="7.5" r="1"/><circle cx="15.5" cy="8.5" r="1"/>',search:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5"/>',x:'<path d="M6 6l12 12M18 6 6 18"/>',plus:'<path d="M12 5v14M5 12h14"/>',minus:'<path d="M5 12h14"/>',chevron:'<path d="m9.5 6 6 6-6 6"/>',chevronDown:'<path d="m6 9.5 6 6 6-6"/>',undo:'<path d="M9 7 4.5 11.5 9 16"/><path d="M5 11.5h9.5a5 5 0 0 1 0 10H11"/>',redo:'<path d="m15 7 4.5 4.5L15 16"/><path d="M19 11.5H9.5a5 5 0 0 0 0 10H13"/>',compare:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 2.5v19"/><path d="M15 9.5l2 2.5-2 2.5"/><path d="M9 9.5 7 12l2 2.5"/>',grid:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M9.2 3.5v17M14.8 3.5v17M3.5 9.2h17M3.5 14.8h17"/>',fit:'<path d="M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15"/>',zoomIn:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M11 8.5v5M8.5 11h5"/>',zoomOut:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M8.5 11h5"/>',sun:'<circle cx="12" cy="12" r="3.5"/><path d="M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4"/>',moon:'<path d="M19.5 14.5A7.5 7.5 0 0 1 9.5 4.5a7.5 7.5 0 1 0 10 10Z"/>',sidebarLeft:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M9.5 4.5v15"/>',sidebarRight:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M14.5 4.5v15"/>',play:'<path d="M8 5.5v13l10.5-6.5L8 5.5Z"/>',pause:'<path d="M8.5 5.5v13M15.5 5.5v13"/>',stepBack:'<path d="M7 5.5v13M18 6l-8 6 8 6V6Z"/>',stepForward:'<path d="M17 5.5v13M6 6l8 6-8 6V6Z"/>',save:'<path d="M5 4.5h11l3.5 3.5v10A1.5 1.5 0 0 1 18 19.5H6A1.5 1.5 0 0 1 4.5 18V6A1.5 1.5 0 0 1 6 4.5Z"/><path d="M8 4.5v4h7v-4M8 19.5v-6h8v6"/>',rename:'<path d="M4 20h4L19 9l-4-4L4 16v4Z"/><path d="m13.5 6.5 4 4"/>',volume:'<path d="M4 9.5h3.5L12 6v12l-4.5-3.5H4z"/><path d="M15.5 9.5a3.5 3.5 0 0 1 0 5M18 7a7 7 0 0 1 0 10"/>',volumeOff:'<path d="M4 9.5h3.5L12 6v12l-4.5-3.5H4z"/><path d="m16 9.5 5 5M21 9.5l-5 5"/>',trash:'<path d="M4.5 7h15M9.5 7V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M6.5 7l1 12a1.5 1.5 0 0 0 1.5 1.4h6a1.5 1.5 0 0 0 1.5-1.4l1-12"/>',link:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/>',braces:'<path d="M8.5 4.5H8A2 2 0 0 0 6 6.5v3A2.5 2.5 0 0 1 3.5 12 2.5 2.5 0 0 1 6 14.5v3a2 2 0 0 0 2 2h.5M15.5 4.5h.5a2 2 0 0 1 2 2v3a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0-2.5 2.5v3a2 2 0 0 1-2 2h-.5"/>',pipette:'<path d="m14.5 6.5 3 3M12 9l-7.2 7.2a2 2 0 0 0-.5 1V20h2.8a2 2 0 0 0 1-.5L15.2 12"/><path d="M13 7.5 15.8 4.7a2.3 2.3 0 0 1 3.3 3.3L16.3 10.8 13 7.5Z"/>',check:'<path d="m5 12.5 4.5 4.5L19 7.5"/>',keyboard:'<rect x="2.5" y="6" width="19" height="12" rx="2"/><path d="M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M8 14h8"/>',reset:'<path d="M4.5 12a7.5 7.5 0 1 0 2.2-5.3L4.5 9"/><path d="M4.5 4.5V9H9"/>',sheet:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M3.5 12h17M12 3.5v17"/>',tiles:'<rect x="3.5" y="3.5" width="7" height="7" rx="1"/><rect x="13.5" y="3.5" width="7" height="7" rx="1"/><rect x="3.5" y="13.5" width="7" height="7" rx="1"/><path d="M13.5 17h7M17 13.5v7"/>',zip:'<path d="M6 3.5h8l4.5 4.5v11a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 19V5A1.5 1.5 0 0 1 6 3.5Z"/><path d="M10 3.5v2h2v2h-2v2h2v2h-2v3"/>',gif:'<rect x="3.5" y="5.5" width="17" height="13" rx="2"/><path d="M10 10.5H8.5a1.5 1.5 0 0 0 0 3H10V12M13 10v4M16 14v-4h2M16 12h1.5"/>',more:'<circle cx="6" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="18" cy="12" r="1"/>',menu:'<path d="M4 7h16M4 12h16M4 17h16"/>',sliders:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',info:'<circle cx="12" cy="12" r="8.5"/><path d="M12 11v5M12 8h.01"/>',unlink:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/><path d="M4 4l16 16"/>',arrowUp:'<path d="M12 19V5M6 11l6-6 6 6"/>',arrowDown:'<path d="M12 5v14M6 13l6 6 6-6"/>',layers:'<path d="m12 4 8.5 4.5L12 13 3.5 8.5 12 4Z"/><path d="m3.5 12.5 8.5 4.5 8.5-4.5"/><path d="m3.5 16.5 8.5 4.5 8.5-4.5"/>',frame:'<path d="M7 3v14a1 1 0 0 0 1 1h13"/><path d="M3 7h13a1 1 0 0 1 1 1v13"/>',copy:'<rect x="8.5" y="8.5" width="11" height="11" rx="1.5"/><path d="M15.5 8.5V6A1.5 1.5 0 0 0 14 4.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5"/>',clipboard:'<rect x="5" y="4.5" width="14" height="16" rx="2"/><path d="M9 4.5V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v.5M9 10h6M9 14h4"/>',github:'<path d="M9 19c-4 1.3-4-2-5.5-2.5M14.5 21v-3.2c0-1 .1-1.4-.5-2 2.6-.3 5.5-1.3 5.5-5.8a4.5 4.5 0 0 0-1.2-3.1 4.2 4.2 0 0 0-.1-3.1s-1-.3-3.3 1.2a11.4 11.4 0 0 0-6 0C6.6 3.5 5.6 3.8 5.6 3.8a4.2 4.2 0 0 0-.1 3.1A4.5 4.5 0 0 0 4.3 10c0 4.5 2.9 5.5 5.5 5.8-.6.6-.6 1.2-.5 2V21"/>'};function Q(e,t=""){return`<svg class="i ${t}" viewBox="0 0 24 24" aria-hidden="true" focusable="false">${si[e]||""}</svg>`}var ll=Object.keys(si);function ci(e){let t=at(e),n="shared",o=[],i=[],r=new Map,a=new Set,c=null,u=0,s=200,l=f=>{for(let h of a)h(t,f)},p=(f,h)=>JSON.stringify(f)===JSON.stringify(h);return{get settings(){return t},get target(){return n},subscribe(f){return a.add(f),()=>a.delete(f)},update(f,h={}){let y=Lt(t,f);if(p(y,t))return;let E=Date.now(),v=h.key&&h.key===c&&E-u<1200;h.history!==!1&&!v&&(o.push(t),o.length>s&&o.shift(),i.length=0),c=h.key||null,u=E,t=y,l("update")},replace(f,h="replace"){f=at(f),!p(f,t)&&(o.push(t),i.length=0,c=null,t=f,l(h))},setTarget(f,h){r.set(n,{past:o,future:i}),n=f;let y=r.get(f)||{past:[],future:[]};o=y.past,i=y.future,c=null,t=at(h),l("target")},dropTarget(f){f!==n&&r.delete(f)},commit(){c=null},undo(){return o.length?(i.push(t),t=o.pop(),c=null,l("undo"),!0):!1},redo(){return i.length?(o.push(t),t=i.pop(),c=null,l("redo"),!0):!1},get canUndo(){return o.length>0},get canRedo(){return i.length>0}}}var li=[.25,.5,1,2,3,4,6,8,12,16,24,32,48,64];function ui({onPick:e,onViewChange:t}={}){let n=m("canvas.screen",{role:"img","aria-label":"Preview"}),o=m("span.lbl.l",{text:"Original"}),i=m("span.lbl.r",{text:"Pixel"}),r=m("button",{type:"button","aria-label":"Drag to compare original and result",html:Q("compare")}),a=m("div.itp-split",{hidden:!0},o,i,r),c=m("div.itp-view",{tabindex:"0","aria-label":"Canvas. Scroll to zoom, drag to pan."},n,a),u=n.getContext("2d"),s={result:null,original:null,crop:null,w:0,h:0,x:0,y:0,z:1,fitted:!0,compare:!1,splitAt:.5,grid:!1,picking:!1},l=1,p=0,f=0,h=null,y="";function E(){let C=getComputedStyle(c),D=C.getPropertyValue("--checker-a").trim()||"#1a1b1f",F=C.getPropertyValue("--checker-b").trim()||"#222",I=D+F;if(I===y)return h;let N=document.createElement("canvas");N.width=N.height=16;let z=N.getContext("2d");return z.fillStyle=D,z.fillRect(0,0,16,16),z.fillStyle=F,z.fillRect(0,0,8,8),z.fillRect(8,8,8,8),y=I,h=u.createPattern(N,"repeat"),h}function v(){let C=c.getBoundingClientRect(),D=Math.min(3,window.devicePixelRatio||1);if(Math.abs(C.width-p)<.5&&Math.abs(C.height-f)<.5&&D===l&&n.width>1){_();return}l=D,p=C.width,f=C.height,n.width=Math.max(1,Math.round(p*l)),n.height=Math.max(1,Math.round(f*l)),s.fitted?x(!1):_()}function M(){if(!s.w)return 1;let C=p<600?16:48;return Math.max(.05,Math.min((p-C)/s.w,(f-C)/s.h))}function x(C=!0){s.z=M(),s.x=(p-s.w*s.z)/2,s.y=(f-s.h*s.z)/2,s.fitted=!0,_(),C&&t&&t(j())}function S(C,D=p/2,F=f/2){C=Math.max(.05,Math.min(128,C));let I=(D-s.x)/s.z,N=(F-s.y)/s.z;s.z=C,s.x=D-I*C,s.y=F-N*C,s.fitted=!1,_(),t&&t(j())}function b(C,D,F){let I=s.z,N;C>0?N=li.find(z=>z>I+1e-6)||I*1.5:N=[...li].reverse().find(z=>z<I-1e-6)||I/1.5,S(N,D,F)}function _(){if(u.setTransform(1,0,0,1,0,0),u.clearRect(0,0,n.width,n.height),!s.result){a.hidden=!0;return}u.setTransform(l,0,0,l,0,0);let C=Math.round(s.x*l)/l,D=Math.round(s.y*l)/l,F=Math.round(s.w*s.z*l)/l,I=Math.round(s.h*s.z*l)/l;if(u.fillStyle=E(),u.fillRect(C,D,F,I),u.imageSmoothingEnabled=!1,u.drawImage(s.result,C,D,F,I),s.compare&&s.original){let N=C+F*s.splitAt;u.save(),u.beginPath(),u.rect(C,D,Math.max(0,N-C),I),u.clip(),u.fillStyle=E(),u.fillRect(C,D,F,I),u.imageSmoothingEnabled=!0,u.imageSmoothingQuality="high";try{let z=s.original.naturalWidth||s.original.videoWidth||s.original.width,se=s.original.naturalHeight||s.original.videoHeight||s.original.height,de=s.crop||{x:0,y:0,w:1,h:1};u.drawImage(s.original,de.x*z,de.y*se,de.w*z,de.h*se,C,D,F,I)}catch{}u.restore(),a.hidden=!1,a.style.left=`${N}px`,a.style.top=`${Math.max(0,D)}px`,a.style.bottom=`${Math.max(0,f-(D+I))}px`}else a.hidden=!0;if(s.grid&&s.z>=6){u.save(),u.beginPath(),u.rect(C,D,F,I),u.clip(),u.strokeStyle="rgba(127,127,127,0.35)",u.lineWidth=1/l,u.beginPath();let N=Math.max(0,Math.floor(-s.x/s.z)),z=Math.min(s.w,Math.ceil((p-s.x)/s.z)),se=Math.max(0,Math.floor(-s.y/s.z)),de=Math.min(s.h,Math.ceil((f-s.y)/s.z));for(let oe=N;oe<=z;oe++){let ee=Math.round((C+oe*s.z)*l)/l+.5/l;u.moveTo(ee,Math.max(D,0)),u.lineTo(ee,Math.min(D+I,f))}for(let oe=se;oe<=de;oe++){let ee=Math.round((D+oe*s.z)*l)/l+.5/l;u.moveTo(Math.max(C,0),ee),u.lineTo(Math.min(C+F,p),ee)}u.stroke(),u.restore()}}let L=null,P=new Map;c.addEventListener("pointerdown",C=>{if(!(C.target===r||r.contains(C.target))&&!(C.target!==c&&C.target!==n)){if(c.focus({preventScroll:!0}),P.set(C.pointerId,{x:C.clientX,y:C.clientY}),c.setPointerCapture(C.pointerId),s.picking&&C.button===0&&P.size===1){let D=c.getBoundingClientRect(),F=(C.clientX-D.left-s.x)/(s.w*s.z),I=(C.clientY-D.top-s.y)/(s.h*s.z);F>=0&&I>=0&&F<1&&I<1&&e&&e(F,I);return}L={x:C.clientX,y:C.clientY,ox:s.x,oy:s.y},c.classList.add("panning")}}),c.addEventListener("pointermove",C=>{if(!P.has(C.pointerId))return;let D=P.get(C.pointerId);if(P.set(C.pointerId,{x:C.clientX,y:C.clientY}),P.size===2){let[F,I]=[...P.values()],N=[...P.entries()].find(([de])=>de!==C.pointerId)[1],z=Math.hypot(D.x-N.x,D.y-N.y),se=Math.hypot(F.x-I.x,F.y-I.y);if(z>0){let de=c.getBoundingClientRect();S(s.z*se/z,(F.x+I.x)/2-de.left,(F.y+I.y)/2-de.top)}L=null;return}L&&(s.x=L.ox+C.clientX-L.x,s.y=L.oy+C.clientY-L.y,s.fitted=!1,_())});let R=C=>{P.delete(C.pointerId),P.size||(L=null,c.classList.remove("panning"),t&&t(j()))};c.addEventListener("pointerup",R),c.addEventListener("pointercancel",R),c.addEventListener("wheel",C=>{C.preventDefault();let D=c.getBoundingClientRect(),F=C.clientX-D.left,I=C.clientY-D.top;if(!C.ctrlKey&&C.deltaMode===0&&Math.abs(C.deltaX)>0){s.x-=C.deltaX,s.y-=C.deltaY,s.fitted=!1,_();return}C.ctrlKey&&C.deltaMode===0?S(s.z*Math.exp(-C.deltaY*.01),F,I):b(C.deltaY<0?1:-1,F,I)},{passive:!1}),c.addEventListener("dblclick",()=>x()),r.addEventListener("pointerdown",C=>{C.preventDefault(),r.setPointerCapture(C.pointerId);let D=I=>{let N=c.getBoundingClientRect();s.splitAt=Math.min(1,Math.max(0,(I.clientX-N.left-s.x)/(s.w*s.z))),_()},F=()=>{r.removeEventListener("pointermove",D),r.removeEventListener("pointerup",F)};r.addEventListener("pointermove",D),r.addEventListener("pointerup",F)}),r.addEventListener("keydown",C=>{(C.key==="ArrowLeft"||C.key==="ArrowRight")&&(C.preventDefault(),C.stopPropagation(),s.splitAt=Math.min(1,Math.max(0,s.splitAt+(C.key==="ArrowLeft"?-.05:.05))),_())}),new ResizeObserver(v).observe(c);let j=()=>({zoom:s.z,fitted:s.fitted,x:s.x,y:s.y});return{el:c,show(C,D,F){let I=!s.result||C.width!==s.w||C.height!==s.h,N={w:s.w*s.z,cx:s.x+s.w*s.z/2,cy:s.y+s.h*s.z/2};if(s.result=C,s.original=D||s.original,s.crop=F||null,I)if(s.w=C.width,s.h=C.height,s.fitted||!N.w)x();else{let z=N.w/s.w;s.z=z,s.x=N.cx-s.w*z/2,s.y=N.cy-s.h*z/2,_(),t&&t(j())}else _()},clear(){s.result=null,s.original=null,s.w=s.h=0,s.fitted=!0,_()},fit:x,zoomTo:S,zoomStep:b,zoomIn(){b(1)},zoomOut(){b(-1)},get zoom(){return s.z},get fitted(){return s.fitted},get rect(){return{x:s.x,y:s.y,width:s.w*s.z,height:s.h*s.z,zoom:s.z}},setCompare(C){s.compare=C,_()},get compare(){return s.compare},setGrid(C){s.grid=C,_()},get grid(){return s.grid},setPicking(C){s.picking=C,c.classList.toggle("picking",C)},get picking(){return s.picking},redraw:_,resize:v}}function di(e,t={},...n){let o=fn("sec"),i=m("span.hint",{}),r=m("button.itp-sec-toggle",{type:"button","aria-controls":o},m("span.title",{text:e}),i,m("span.chev",{html:Q("chevron")})),a=t.onReset?m("button.itp-btn.small.icon.itp-sec-reset",{type:"button",hidden:!0,title:t.resetLabel||`Reset ${e.toLowerCase()}`,"aria-label":t.resetLabel||`Reset ${e.toLowerCase()} to defaults`,html:Q("reset"),onclick:()=>t.onReset()}):null,c=m("div.body",{id:o},...n),u=m("section.itp-sec",{},m("div.itp-sec-head",{},r,a),c),s=l=>{u.dataset.open=String(l),r.setAttribute("aria-expanded",String(l)),c.hidden=!l};return r.addEventListener("click",()=>{let l=u.dataset.open!=="true";s(l),t.onToggle?.(l)}),s(t.open!==!1),{el:u,body:c,setHint(l){i.textContent=l},setChanged(l){a&&(a.hidden=!l)},setOpen:s,get open(){return u.dataset.open==="true"}}}function Mt(e,t,{help:n="",value:o=null,id:i}={}){let r=m("div.lab",{},m("label",{for:i||t.id||null,text:e}),o);return m("div.itp-field",{},r,t,n?m("div.help",{text:n}):null)}function Oe(e){let t=fn("sl"),n=e.scale||1,o=e.step||1,i=m("input",{type:"range",id:t,min:e.min*n,max:e.max*n,step:o*n,"aria-label":e.label}),r=m("input.itp-input",{type:"number",min:e.min*n,max:e.max*n,step:o*n,"aria-label":`${e.label} value`}),a=()=>{let s=(i.value-i.min)/(i.max-i.min)*100;i.style.setProperty("--p",`${s}%`)},c=s=>{let l=Os(s*n,o*n);i.value=l,r.value=l,a()};return i.addEventListener("input",()=>{r.value=i.value,a(),e.onInput(Number(i.value)/n)}),i.addEventListener("change",()=>e.onCommit&&e.onCommit()),r.addEventListener("change",()=>{let s=Math.min(e.max*n,Math.max(e.min*n,Number(r.value)||0));c(s/n),e.onInput(s/n),e.onCommit&&e.onCommit()}),i.addEventListener("dblclick",()=>{e.reset!=null&&(c(e.reset),e.onInput(e.reset),e.onCommit&&e.onCommit())}),c(e.value),{el:Mt(e.label,m("div.itp-slider",{},i,r),{help:e.help,id:t}),set:c,input:i}}var Os=(e,t)=>{let n=Math.max(0,-Math.floor(Math.log10(t)+1e-9));return Number((Math.round(e/t)*t).toFixed(n))};function Ut(e){let t=fn("se"),n=m("select.itp-select",{id:t,"aria-label":e.label}),o=new Map;for(let r of e.options){let a=m("option",{value:r.value,text:r.label});if(r.group){if(!o.has(r.group)){let c=m("optgroup",{label:r.group});o.set(r.group,c),n.append(c)}o.get(r.group).append(a)}else n.append(a)}return n.addEventListener("change",()=>e.onChange(n.value)),{el:e.bare?n:Mt(e.label,n,{help:e.help,id:t}),select:n,set(r){n.value=r}}}function Wt(e){let t=e.options.map(r=>m("button",{type:"button","aria-pressed":"false",title:r.title||null,html:(r.icon?Q(r.icon):"")+(r.label?`<span>${r.label}</span>`:""),onclick:()=>e.onChange(r.value)})),n=m("div.itp-seg",{role:"group","aria-label":e.label},...t),o=r=>t.forEach((a,c)=>a.setAttribute("aria-pressed",String(e.options[c].value===r)));return o(e.value),{el:e.bare?n:Mt(e.label,n,{help:e.help}),set:o}}function It(e){let t=m("input",{type:"checkbox",role:"switch"});t.addEventListener("change",()=>e.onChange(t.checked));let n=m("label.itp-switch",{},m("span",{text:e.label}),t);return{el:e.help?m("div.itp-field",{},n,m("div.help",{text:e.help})):n,set(i){t.checked=!!i}}}function fi(e){let t=m("input",{type:"color","aria-label":e.label}),n=m("span.mono",{});t.addEventListener("input",()=>{n.textContent=t.value,e.onChange(t.value)});let o=m("label.itp-color",{},t,n),i=r=>{t.value=r,n.textContent=r};return i(e.value||"#000000"),{el:e.bare?o:Mt(e.label,o),set:i}}function qt(e){let t=fn("nu"),n=m("input.itp-input.num",{type:"number",id:t,min:e.min,max:e.max,step:e.step||1,"aria-label":e.label});return n.addEventListener("change",()=>{let o=Math.min(e.max,Math.max(e.min,Number(n.value)||e.min));(n.value!==""||!n.placeholder)&&(n.value=o),e.onChange(o)}),{el:e.bare?n:Mt(e.label,n,{help:e.help,id:t}),input:n,set(o){n.value=o}}}Vt();vt();var wo=class{constructor(){this.buf=new Uint8Array(65536),this.n=0}byte(t){if(this.n===this.buf.length){let n=new Uint8Array(this.buf.length*2);n.set(this.buf),this.buf=n}this.buf[this.n++]=t}bytes(t){for(let n=0;n<t.length;n++)this.byte(t[n])}u16(t){this.byte(t&255),this.byte(t>>8&255)}str(t){for(let n=0;n<t.length;n++)this.byte(t.charCodeAt(n))}result(){return this.buf.slice(0,this.n)}};function Ds(e,t,n){let o=1<<t,i=o+1,r=t+1,a=i+1,c=new Map,u=0,s=0,l=[],p=[],f=y=>{for(u|=y<<s,s+=r;s>=8;)p.push(u&255),u>>>=8,s-=8,p.length===255&&(l.push(p),p=[])};f(o);let h=e[0];for(let y=1;y<e.length;y++){let E=e[y],v=h*256+E,M=c.get(v);if(M!==void 0){h=M;continue}f(h),a<4096?(c.set(v,a++),a>1<<r&&r<12&&r++):(f(o),c=new Map,r=t+1,a=i+1),h=E}f(h),f(i),s>0&&p.push(u&255),p.length&&l.push(p),n.byte(t);for(let y of l)n.byte(y.length),n.bytes(y);n.byte(0)}var xo=(e,t)=>e[t+3]<128?-1:e[t]<<16|e[t+1]<<8|e[t+2];function pi(e,t){let n=[...e].filter(c=>c!==-1),o=n.map(c=>[c>>16,c>>8&255,c&255]),i=t?o.length:-1;t&&o.push([0,0,0]);let r=1;for(;1<<r<o.length;)r++;for(;o.length<1<<r;)o.push([0,0,0]);let a=new Map(n.map((c,u)=>[c,u]));return{colors:o,bits:r,tIndex:i,index:a}}function Fs(e,t){let n=Sn(e,t).map(wt),o=new Uint8ClampedArray(e.data),i=new Map;for(let r=0;r<o.length;r+=4){if(o[r+3]<128)continue;let a=o[r]<<16|o[r+1]<<8|o[r+2],c=i.get(a);if(c===void 0){let u=1/0;c=0;for(let s=0;s<n.length;s++){let l=o[r]-n[s][0],p=o[r+1]-n[s][1],f=o[r+2]-n[s][2],h=l*l*3+p*p*4+f*f*2;h<u&&(u=h,c=s)}i.set(a,c)}o.set(n[c],r)}return{...e,data:o}}function hi(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(1,Math.round(t.scale||1)),o=e.map(h=>({...n>1?Rt(h,n):h,delay:h.delay??t.delay??100})),i=o[0].width,r=o[0].height,a=!1,c=new Set,u=o.map(h=>{let y=new Set;for(let E=0;E<h.data.length;E+=4){let v=xo(h.data,E);v===-1&&(a=!0),y.add(v),c.add(v)}return y}),s=h=>h.size-(h.has(-1)?1:0),p=s(c)+(a?1:0)<=256?pi(c,a):null,f=new wo;if(f.str("GIF89a"),f.u16(i),f.u16(r),f.byte(p?240|p.bits-1:0),f.byte(0),f.byte(0),p)for(let h of p.colors)f.bytes(h);return o.length>1&&t.loop!==-1&&(f.byte(33),f.byte(255),f.byte(11),f.str("NETSCAPE2.0"),f.byte(3),f.byte(1),f.u16(t.loop||0),f.byte(0)),o.forEach((h,y)=>{let E=h,v=p,M=u[y];if(!v){let S=a?255:256;if(s(M)>S){E=Fs(h,S),M=new Set;for(let b=0;b<E.data.length;b+=4)M.add(xo(E.data,b))}v=pi(M,M.has(-1))}if(f.byte(33),f.byte(249),f.byte(4),f.byte((a?2:1)<<2|(v.tIndex>=0?1:0)),f.u16(Math.max(2,Math.round(E.delay/10))),f.byte(v.tIndex>=0?v.tIndex:0),f.byte(0),f.byte(44),f.u16(0),f.u16(0),f.u16(i),f.u16(r),f.byte(v===p?0:128|v.bits-1),v!==p)for(let S of v.colors)f.bytes(S);let x=new Uint8Array(i*r);for(let S=0;S<x.length;S++){let b=xo(E.data,S*4);x[S]=b===-1?v.tIndex:v.index.get(b)}Ds(x,Math.max(2,v.bits),f)}),f.byte(59),f.result()}var mi=new TextEncoder;function pn(e){let t=[],n=[],o=0,i=new Set;for(let l of e){let p=l.name.replace(/\\/g,"/").replace(/^\/+/,"");if(i.has(p)){let L=/^(.*?)(\.[^.]*)?$/.exec(p),P=2;for(;i.has(`${L[1]}-${P}${L[2]||""}`);)P++;p=`${L[1]}-${P}${L[2]||""}`}i.add(p);let f=mi.encode(p),h=typeof l.data=="string"?mi.encode(l.data):l.data,y=In(h),E=l.date||new Date,v=E.getHours()<<11|E.getMinutes()<<5|E.getSeconds()>>1,M=E.getFullYear()-1980<<9|E.getMonth()+1<<5|E.getDate(),x=new Uint8Array(30+f.length),S=new DataView(x.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,2048,!0),S.setUint16(8,0,!0),S.setUint16(10,v,!0),S.setUint16(12,M,!0),S.setUint32(14,y,!0),S.setUint32(18,h.length,!0),S.setUint32(22,h.length,!0),S.setUint16(26,f.length,!0),S.setUint16(28,0,!0),x.set(f,30);let b=new Uint8Array(46+f.length),_=new DataView(b.buffer);_.setUint32(0,33639248,!0),_.setUint16(4,20,!0),_.setUint16(6,20,!0),_.setUint16(8,2048,!0),_.setUint16(10,0,!0),_.setUint16(12,v,!0),_.setUint16(14,M,!0),_.setUint32(16,y,!0),_.setUint32(20,h.length,!0),_.setUint32(24,h.length,!0),_.setUint16(28,f.length,!0),_.setUint32(42,o,!0),b.set(f,46),t.push(x,h),n.push(b),o+=x.length+h.length}let r=n.reduce((l,p)=>l+p.length,0),a=new Uint8Array(22),c=new DataView(a.buffer);c.setUint32(0,101010256,!0),c.setUint16(8,e.length,!0),c.setUint16(10,e.length,!0),c.setUint32(12,r,!0),c.setUint32(16,o,!0);let u=new Uint8Array(o+r+22),s=0;for(let l of[...t,...n,a])u.set(l,s),s+=l.length;return u}var vo=(e,t)=>({width:e,height:t,data:new Uint8ClampedArray(e*t*4)});function $s(e,t,n,o,i=0,r=0,a=t.width,c=t.height){for(let u=0;u<c;u++){let s=((r+u)*t.width+i)*4,l=((o+u)*e.width+n)*4;e.data.set(t.data.subarray?t.data.subarray(s,s+a*4):Array.prototype.slice.call(t.data,s,s+a*4),l)}}function Eo(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(0,t.padding|0),o=Math.max(...e.map(f=>f.width)),i=Math.max(...e.map(f=>f.height)),r=Math.max(1,Math.min(e.length,t.columns||Math.ceil(Math.sqrt(e.length)))),a=Math.ceil(e.length/r),c=r*o+(r-1)*n,u=a*i+(a-1)*n,s=vo(c,u),l={};e.forEach((f,h)=>{let y=h%r*(o+n),E=Math.floor(h/r)*(i+n);$s(s,f,y,E),l[f.name||`frame-${String(h).padStart(3,"0")}`]={frame:{x:y,y:E,w:f.width,h:f.height},sourceSize:{w:f.width,h:f.height},...f.delay!=null?{duration:Math.round(f.delay)}:{}}});let p={frames:l,meta:{app:"image-to-pixel",image:(t.name||"sheet")+".png",size:{w:c,h:u},scale:"1",columns:r,rows:a,padding:n}};return{image:s,atlas:p}}function gi(e,t={}){let n=Math.max(1,t.tileWidth||8),o=Math.max(1,t.tileHeight||n),i=Math.ceil(e.width/n),r=Math.ceil(e.height/o),a=[],c=new Map,u=[],s=[],l=(y,E)=>{let v=vo(n,o);for(let M=0;M<o;M++)for(let x=0;x<n;x++){let S=y*n+x,b=E*o+M;if(S>=e.width||b>=e.height)continue;let _=(b*e.width+S)*4;v.data.set([e.data[_],e.data[_+1],e.data[_+2],e.data[_+3]],(M*n+x)*4)}return v},p=y=>{let E="";for(let v=0;v<y.data.length;v+=4)E+=y.data[v+3]===0?".":String.fromCharCode(y.data[v]+1,y.data[v+1]+1,y.data[v+2]+1);return E},f=(y,E,v)=>{let M=vo(n,o);for(let x=0;x<o;x++)for(let S=0;S<n;S++){let b=((v?o-1-x:x)*n+(E?n-1-S:S))*4;M.data.set(y.data.subarray(b,b+4),(x*n+S)*4)}return M};for(let y=0;y<r;y++)for(let E=0;E<i;E++){let v=l(E,y),M=c.get(p(v)),x=0;if(M===void 0&&t.flips)for(let[S,b,_]of[[1,0,1],[0,1,2],[1,1,3]]){let L=c.get(p(f(v,S,b)));if(L!==void 0){M=L,x=_;break}}M===void 0&&(M=a.length,a.push(v),c.set(p(v),M)),u.push(M),s.push(x)}return{image:Eo(a,{columns:t.columns||Math.min(16,a.length)}).image,map:{width:i,height:r,tileWidth:n,tileHeight:o,tiles:u,...t.flips?{flips:s}:{}},count:a.length}}Fn();var zs=null,Bs=()=>zs||(zs=document.body.appendChild(m("div.itp-toasts.itp",{role:"status","aria-live":"polite"})));function Z(e,t={}){let n=t.kind||"info",o=m("div.msg",{},m("div",{text:e})),i=t.progress?m("div.itp-progress",{},m("i")):null;i&&o.append(i);let r=m(`div.itp-toast.${n}`,{},t.progress?m("div.itp-spinner"):m("span.itp-dot"),o);t.action&&r.append(m("button.itp-btn.small.outline",{type:"button",text:t.action.label,onclick:()=>{t.action.onClick(),c()}})),t.onCancel?r.append(m("button.itp-btn.small",{type:"button",text:"Cancel",onclick:()=>{t.onCancel(),c()}})):r.append(m("button.itp-btn.small.icon",{type:"button","aria-label":"Dismiss",html:Q("x"),onclick:()=>c()})),Bs().append(r);let a=null,c=()=>{clearTimeout(a),r.remove()};return(s=>{clearTimeout(a),s&&(a=setTimeout(c,s))})(t.timeout??(t.progress?0:n==="error"?7e3:3200)),{update(s){o.firstChild.textContent=s},progress(s){i&&(i.firstChild.style.width=`${Math.round(s*100)}%`)},close:c,done(s,l="ok"){c(),Z(s,{kind:l})}}}var on=null;function hn(e,t,{align:n="end"}={}){Yt();let o=m("div.itp-menu.itp",{role:"menu"});for(let f of t){if(f==="sep"){o.append(m("hr"));continue}if(f.group){o.append(m("div.mlabel",{text:f.group}));continue}let h=m("button.mi",{type:"button",role:"menuitem",disabled:!!f.disabled},m("span",{html:f.icon?Q(f.icon):""}),m("span",{},f.label,f.sub?m("small",{text:f.sub}):null),f.kbd?m("kbd",{text:f.kbd}):m("span"));h.addEventListener("click",()=>{Yt(),f.onClick()}),o.append(h)}document.body.append(o);let i=e.getBoundingClientRect(),r=o.offsetWidth,a=o.offsetHeight,c=n==="end"?i.right-r:i.left;c=Math.max(8,Math.min(c,innerWidth-r-8));let u=i.bottom+6;u+a>innerHeight-8&&(u=Math.max(8,i.top-a-6)),Object.assign(o.style,{left:`${c}px`,top:`${u}px`}),e.setAttribute("aria-expanded","true");let s=[...o.querySelectorAll("button.mi:not(:disabled)")];s[0]?.focus();let l=f=>{let h=s.indexOf(document.activeElement);f.key==="Escape"?(f.preventDefault(),Yt(),e.focus()):f.key==="ArrowDown"?(f.preventDefault(),s[(h+1)%s.length]?.focus()):f.key==="ArrowUp"?(f.preventDefault(),s[(h-1+s.length)%s.length]?.focus()):f.key==="Tab"&&Yt()},p=f=>{!o.contains(f.target)&&f.target!==e&&!e.contains(f.target)&&Yt()};o.addEventListener("keydown",l),setTimeout(()=>document.addEventListener("pointerdown",p,!0)),on={el:o,anchor:e,cleanup:()=>document.removeEventListener("pointerdown",p,!0)}}function Yt(){on&&(on.cleanup(),on.el.remove(),on.anchor.setAttribute("aria-expanded","false"),on=null)}function mn(e,t,{actions:n=[],onClose:o}={}){let i=m("div.content",{},t),r=m("dialog.itp-dialog.itp",{"aria-label":e},m("header",{},m("h2",{text:e}),m("button.itp-btn.icon",{type:"button","aria-label":"Close",html:Q("x"),onclick:()=>r.close()})),i,n.length?m("footer",{},...n.map(a=>m(`button.itp-btn${a.primary?".primary":".outline"}`,{type:"button",text:a.label,onclick:async()=>{await a.onClick?.()!==!1&&r.close()}}))):null);return r.addEventListener("close",()=>{r.remove(),o?.()}),document.body.append(r),r.showModal(),r.body=i,r.setContent=(...a)=>st(i,...a),r}var Dt=e=>(e||"image").replace(/\.[^.]+$/,"").replace(/[^\w.-]+/g,"-").replace(/^-+|-+$/g,"")||"image",Vn=e=>({scale:e.export.scale,grid:e.export.grid,gridColor:e.export.gridColor,indexed:e.export.indexed});function Xn(e,t,n){return e.export.size==="source"&&t&&n&&t.crop?{width:Math.max(1,Math.round(t.crop.w*n.width)),height:Math.max(1,Math.round(t.crop.h*n.height))}:{width:t?t.width*e.export.scale:0,height:t?t.height*e.export.scale:0}}var Io=(e,t,n)=>e.export.size==="source"&&n?{...Xn(e,t,n),indexed:e.export.indexed}:Vn(e);function tc(e,t,n=4){let o=Math.max(1,Math.ceil(240/Math.min(t.width,t.height))),i=c=>{let u=Math.round(c*16/9),s=t.height>t.width,l=s?c:u,p=s?u:c;return Math.max(o,Math.min(Math.floor(l/t.width),Math.floor(p/t.height)))},r=e==="scale"?Math.max(o,n):i(Number(e)||1080);return[r,i(1080),i(720),o].filter((c,u,s)=>c<=r&&s.indexOf(c)===u).sort((c,u)=>u-c)}function Pi(e){let t=()=>e.store.settings;async function n(){if(!e.result)return Z("Open an image first",{kind:"error"});let l=t(),p=await ft(e.result,Io(l,e.result,e.current)),f=Xn(l,e.result,e.current),h=l.export.size==="source"?`-${f.width}x${f.height}`:l.export.scale>1?`@${l.export.scale}x`:"";We(p,`${Dt(e.current.name)}-${e.result.width}x${e.result.height}${h}.png`,"image/png"),Z(`Saved ${f.width} \xD7 ${f.height} PNG`,{kind:"ok"})}async function o(){if(e.result)try{let l=await ft(e.result,{...Io(t(),e.result,e.current),indexed:!1});await navigator.clipboard.write([new ClipboardItem({"image/png":new Blob([l],{type:"image/png"})})]),Z("Image copied",{kind:"ok"})}catch(l){Z(`Couldn't copy: ${l.message}`,{kind:"error"})}}async function i(l,p){let f=new AbortController,h=Z(l,{progress:!0,onCancel:()=>f.abort()});e.exporting=!0;try{let y=await p(f.signal,(E,v)=>{h.progress(E),v&&h.update(v)});h.done(y)}catch(y){h.close(),y.name!=="AbortError"?(Z(`Export failed: ${y.message}`,{kind:"error"}),console.error(y)):Z("Export cancelled")}finally{e.exporting=!1,e.schedule()}}async function r(){let l=e.items.slice();l.length&&await i(`Processing ${l.length} files`,async(p,f)=>{let h=[],y=[];for(let E=0;E<l.length;E++){if(p.aborted)throw new DOMException("Aborted","AbortError");let v=l[E],M=e.settingsFor(v);v.type==="video"&&e.engine.invalidate();let x=await e.engine.process(v.source,M);h.push({name:`${Dt(v.name)}.png`,data:await ft(x,Io(M,x,v))}),v.own&&y.push({name:`${Dt(v.name)}.settings.json`,data:Qt(M)}),f((E+1)/l.length,`Processed ${E+1} of ${l.length}`)}return h.push({name:"settings.json",data:Qt(e.shared)},...y),We(pn(h),"pixel-art.zip","application/zip"),`Saved ${l.length} images as a ZIP`})}async function a(l,p,f,h){let y=t();if(l.source==="files"){let x=e.items.filter(b=>b.type==="image"),S=null;for(let b=0;b<x.length;b++){if(p.aborted)throw new DOMException("Aborted","AbortError");let _=e.settingsFor(x[b]),L=await e.engine.process(x[b].source,S?Lt(_,{size:S}):_);S||(S={mode:"width",width:L.width,height:L.height}),await h(L,b,x.length,x[b].name),f((b+1)/x.length,`Frame ${b+1} of ${x.length}`)}return x.length}let E=e.current;if(!E||E.type!=="video")throw new Error("Open a video first");let v=E.source,M=l.end>l.start?l.end:v.duration;return Dn(v,{fps:l.fps,start:l.start,end:M,signal:p,onFrame:async({index:x,total:S})=>{e.engine.invalidate();let b=await e.engine.process(v,y);await h(b,x,S,`${Dt(E.name)}-${String(x).padStart(4,"0")}`),f((x+1)/S,`Frame ${x+1} of ${S}`)}})}async function c(l){let p=l.source==="files"?"animation":Dt(e.current?.name),f=t(),h=1e3/l.fps;if(l.format==="gif"||l.format==="png-seq"){await i("Rendering frames",async(y,E)=>{let v=[];if(await a(l,y,E,async(M,x,S,b)=>{l.format==="gif"?v.push({width:M.width,height:M.height,data:M.data,delay:h}):v.push({name:`${b}.png`,data:await ft(M,Vn(f))})}),l.format==="gif"){E(1,"Encoding GIF"),await new Promise(x=>setTimeout(x,0));let M=hi(v,{scale:f.export.scale,loop:0});return We(M,`${p}.gif`,"image/gif"),`Saved GIF (${v.length} frames, ${(M.length/1024).toFixed(0)} KB)`}return We(pn(v),`${p}-frames.zip`,"application/zip"),`Saved ${v.length} PNG frames`});return}await i(`Encoding ${l.format.toUpperCase()}`,async(y,E)=>{let{createVideoEncoder:v,decodeAudio:M}=await Promise.resolve().then(()=>(Uo(),Ro)),x=e.current,S=null;if(l.audio&&l.source==="video"&&x&&x.type==="video"&&x.file){E(0,"Reading audio");let P=l.end>l.start?l.end:x.source.duration;S=await M(x.file,{start:l.start,end:P}).catch(R=>(console.warn("[export] audio",R),null))}let b=null;await a(l,y,E,async P=>{if(!b){let R=tc(l.videoSize,P,f.export.scale),j=null;for(let C of R)try{b=await v({format:l.format,fps:l.fps,width:P.width,height:P.height,scale:C,audio:S});break}catch(D){if(j=D,!/encoder available/.test(D.message))throw D}if(!b)throw j}await b.add(P)}),S&&b.audioCodec&&E(1,"Encoding audio");let _=await b.finish();We(_,`${p}.${l.format}`);let L=!l.audio||l.source!=="video"?"":b.audioCodec==="opus"&&l.format==="mp4"?", with Opus audio: VLC and browsers play it, Windows Media Player and QuickTime may not":b.audioCodec?", with audio":S?", without audio (this browser can't encode it)":", no audio track in the source";return`Saved ${l.format.toUpperCase()} (${(_.size/1024/1024).toFixed(1)} MB${L})`})}async function u(l){let p=l.source==="files"?"sheet":`${Dt(e.current?.name)}-sheet`,f=t();await i("Building sprite sheet",async(h,y)=>{let E=[];await a(l,h,y,(S,b,_,L)=>{E.push({width:S.width,height:S.height,data:S.data,name:L?Dt(L):void 0,delay:1e3/l.fps})});let{image:v,atlas:M}=Eo(E,{columns:l.columns,padding:l.padding,name:p});if(f.export.scale>1){let S=f.export.scale;for(let b of Object.values(M.frames)){for(let _ of["x","y","w","h"])b.frame[_]*=S;b.sourceSize.w*=S,b.sourceSize.h*=S}M.meta.size.w*=S,M.meta.size.h*=S,M.meta.scale=String(S)}let x=await ft(v,Vn(f));return We(pn([{name:`${p}.png`,data:x},{name:`${p}.json`,data:JSON.stringify(M,null,2)}]),`${p}.zip`,"application/zip"),`Saved a ${E.length}-frame sprite sheet`})}async function s({tile:l,flips:p}){if(!e.result)return Z("Open an image first",{kind:"error"});let f=t(),h=gi(e.result,{tileWidth:l,tileHeight:l,flips:p}),y=`${Dt(e.current.name)}-tiles`,E=await ft(h.image,Vn(f)),v={...h.map,image:`${y}.png`,note:"tiles[] holds one tile index per cell, row by row"+(p?"; flips[] is 0 none, 1 horizontal, 2 vertical, 3 both":"")};We(pn([{name:`${y}.png`,data:E},{name:`${y}.json`,data:JSON.stringify(v,null,2)}]),`${y}.zip`,"application/zip"),Z(`Saved ${h.count} unique tiles (${h.map.width} \xD7 ${h.map.height} map)`,{kind:"ok"})}return{exportPNG:n,copyImage:o,exportZip:r,exportAnimation:c,exportSheet:u,exportTileset:s}}var Li="itp:";function pt(e,t){try{let n=localStorage.getItem(Li+e);return n==null?t:JSON.parse(n)}catch{return t}}function ct(e,t){try{return localStorage.setItem(Li+e,JSON.stringify(t)),!0}catch{return!1}}function Ui(e){let{store:t}=e,n=(w,G)=>t.update(w,{key:G}),o=()=>t.commit(),i=()=>t.settings,r=Et(),a=(w,G)=>JSON.stringify(w)===JSON.stringify(G),c=pt("sections",{}),u=(w,G,ne,d,...g)=>di(G,{open:c[w]??ne,onToggle:k=>{c[w]=k,ct("sections",c)},onReset:d?()=>{let k={};for(let A of d)k[A]=JSON.parse(JSON.stringify(r[A]));t.update(k)}:null},...g),s=m("div.v",{text:"\u2013"}),l=m("div.v",{text:"\u2013"}),p=m("div.v",{text:"\u2013"}),f=m("div.itp-stats",{"aria-live":"polite"},m("div.itp-stat",{},m("div.k",{text:"Output"}),s),m("div.itp-stat",{},m("div.k",{text:"Colours"}),l),m("div.itp-stat",{},m("div.k",{text:"Render"}),p)),h=m("button",{type:"button",role:"tab","aria-selected":"true",id:"itp-tab-setup","aria-controls":"itp-pane-setup",html:`${Q("sliders")}<span>Setup</span>`}),y=m("button",{type:"button",role:"tab","aria-selected":"false",id:"itp-tab-export","aria-controls":"itp-pane-export",html:`${Q("download")}<span>Export</span>`}),E=m("div.itp-seg",{role:"tablist","aria-label":"Inspector"},h,y),v=Wt({label:"Settings apply to",bare:!0,options:[{value:"shared",label:"All files",icon:"layers"},{value:"own",label:"This file",icon:"unlink"}],value:"shared",onChange:w=>e.current&&e.setOwn(e.current,w==="own")}),M=m("span.itp-scope-note",{}),x=m("div.itp-scope",{hidden:!0},m("div.lab",{},m("span",{text:"Settings apply to"}),M),v.el),S=Wt({label:"Size by",options:[{value:"width",label:"Width"},{value:"block",label:"Pixel size"}],value:"width",onChange:w=>n({size:{mode:w}})}),b=Oe({label:"Pixel width",min:8,max:512,step:1,value:96,reset:96,onInput:w=>n({size:{width:w}},"width"),onCommit:o}),_=qt({label:"Height",min:0,max:2048,help:"Leave empty to keep the aspect ratio.",onChange:w=>n({size:{height:w}})});_.input.placeholder="Auto";let L=Oe({label:"Pixel size",min:1,max:64,step:1,value:8,reset:8,help:"How many source pixels become one output pixel.",onInput:w=>n({size:{block:w}},"block"),onCommit:o}),P=Wt({label:"Resample",options:[{value:"box",label:"Average"},{value:"nearest",label:"Nearest"}],value:"box",help:"Nearest keeps hard edges; use it for art that is already pixelated.",onChange:w=>n({size:{resample:w}})}),R=m("button.itp-btn.small.outline",{type:"button",html:`${Q("grid")}<span>Detect grid</span>`,title:"Find the pixel size of upscaled pixel art",onclick:()=>e.detectGrid()}),j=m("div",{style:{display:"contents"}},b.el,_.el),C=m("div",{style:{display:"contents"}},L.el),D=u("size","Size",!0,["size"],S.el,j,C,P.el,m("div.itp-row",{},R)),F=Jt.map(w=>{let G=w.ratio||1.3333333333333333,ne=m("i",{style:{width:`${Math.round(G>=1?16:16*G)}px`,height:`${Math.round(G>=1?16/G:16)}px`}});return w.ratio||ne.classList.add("orig"),m("button",{type:"button","aria-pressed":"false",title:w.id==="original"?"The source's own shape":`Crop to ${w.label}`,onclick:()=>n({frame:{aspect:w.id}})},ne,m("span",{text:w.label}))}),I=m("div.itp-aspects",{role:"group","aria-label":"Aspect ratio"},...F),N=Oe({label:"Zoom",min:1,max:8,step:.05,value:1,reset:1,help:"Crop into the middle of the frame.",onInput:w=>n({frame:{zoom:w}},"fz"),onCommit:o}),z=Oe({label:"Horizontal position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:w=>n({frame:{x:w}},"fx"),onCommit:o}),se=Oe({label:"Vertical position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:w=>n({frame:{y:w}},"fy"),onCommit:o}),de=u("frame","Frame",!1,["frame"],Mt("Aspect ratio",I),N.el,z.el,se.el),oe=Ut({label:"Source",options:[{value:"builtin",label:"Built-in palette"},{value:"custom",label:"Custom colours"},{value:"extract",label:"From the image"},{value:"none",label:"None (keep colours)"}],onChange:w=>n({palette:{source:w}})}),ee=Ut({label:"Palette",options:an.map(w=>({value:w.id,label:`${w.name} (${w.colors.length})`})),onChange:w=>n({palette:{source:"builtin",id:w}})}),te=Oe({label:"Number of colours",min:2,max:64,step:1,value:16,reset:16,onInput:w=>n({palette:{count:w}},"count"),onCommit:o}),we=m("div.itp-swatches",{role:"list","aria-label":"Palette colours"}),ue=m("span.val.num",{}),W=Mt("Colours",we,{value:ue}),Y=Wt({label:"Colour matching",options:[{value:"oklab",label:"Perceptual"},{value:"rgb",label:"RGB"}],value:"oklab",onChange:w=>n({palette:{distance:w}})}),be=m("div.itp-row",{style:{flexWrap:"wrap"}},m("button.itp-btn.small.outline",{type:"button",html:`${Q("upload")}<span>Import</span>`,title:".gpl, .hex, .pal, .txt or .json",onclick:()=>e.importPalette()}),m("button.itp-btn.small.outline",{type:"button",html:`${Q("palette")}<span>Lospec</span>`,onclick:()=>e.lospecDialog()}),m("button.itp-btn.small.outline",{type:"button",html:`${Q("pipette")}<span>Pick</span>`,title:"Add colours by clicking the image","aria-pressed":"false",onclick:w=>e.togglePicker(w.currentTarget)}),m("button.itp-btn.small",{type:"button",html:`${Q("download")}<span>Save</span>`,title:"Save to Your palettes",onclick:()=>e.savePalette()})),ce=u("palette","Palette",!1,["palette"],oe.el,ee.el,te.el,W,Y.el,be),le={none:"None",ordered:"Ordered",diffusion:"Error diffusion"},me=Ut({label:"Method",options:cn.map(w=>({value:w.id,label:w.label,group:le[w.kind]})),onChange:w=>n({dither:{method:w}})}),pe=Oe({label:"Strength",min:0,max:1,step:.01,scale:100,value:.6,reset:.6,onInput:w=>n({dither:{strength:w}},"strength"),onCommit:o}),ge=m("textarea.itp-input",{rows:4,spellcheck:!1,"aria-label":"Custom threshold matrix",placeholder:`0 8 2 10
301
+ `;var bn=(e,t)=>{let n=document.createElement("canvas");return n.width=e,n.height=t,n};async function ni(){if(typeof document>"u")throw new Error("No DOM");let e=bn(1,1).getContext("webgl2");if(!e)throw new Error("WebGL 2 is not available");if(!e.getExtension("EXT_color_buffer_float"))throw new Error("Float render targets are not available");let t=e.getExtension("WEBGL_debug_renderer_info"),n=String(t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER));e.getExtension("WEBGL_lose_context")?.loseContext();let o=bn(1,1),i=bn(1,1),r=bn(256,1),a=bn(1,1),c=x=>({element:x,filter:"nearest",wrap:"clamp"}),l=Wr({canvas:o,webgl:2,size:[1,1],pixelRatio:1,autoplay:!1,pauseWhenHidden:!1,pointer:!1,errorOverlay:!1,warnMissingUniforms:!1,preserveDrawingBuffer:!0,premultipliedAlpha:!1,antialias:!1,dialect:"shadermate",common:qr,samplers:{u_palette:c(r),u_matrix:c(a)},uniforms:{u_count:1,u_distance:0,u_resample:0,u_adjust:[0,0,0,1],u_hue:0,u_crop:[0,0,1,1],u_alphaCut:.5,u_mode:0,u_levels:1,u_amount:0,u_skew:1,u_strength:1,u_kn:0,u_kernel:new Float32Array(po*3),u_outline:0,u_corners:0,u_outlineColor:[0,0,0]},passes:[{name:"prep",shader:Yr,float:"full",filter:"nearest",channels:[{...c(i),dynamic:!1}]},{name:"quant",shader:Kr,filter:"nearest",channels:["prep"]},{name:"diffuse",shader:Zr,float:"full",filter:"nearest",pingpong:!0,iterations:2,channels:["prep","diffuse"]},{name:"resolve",shader:Jr,filter:"nearest",channels:["quant","diffuse"]},{name:"orphan",shader:Qr,filter:"nearest",channels:["resolve"]},{name:"smooth",shader:ei,filter:"nearest",channels:["orphan"]},{name:"out",shader:ti,screen:!0,channels:["smooth"]}]}),s=null;if(l.on("error",x=>{s=x}),await l.ready,s||l.error)throw l.destroy(),s||l.error;let d=(x,w)=>{for(let y in w)l.set(y,w[y],x)},h=null,f="",p="";async function b(x){if(x.canvas===h&&!x.dirty)return;i.width=x.width,i.height=x.height;let w=i.getContext("2d");w.clearRect(0,0,i.width,i.height),w.drawImage(x.canvas,0,0),await l.setChannel(0,{...c(i),dynamic:!1},"prep"),h=x.canvas}function M(x){let w=x.palette.map(_=>_.join(",")).join(";");if(w===f)return;f=w;let y=r.getContext("2d"),A=y.createImageData(256,1);x.palette.forEach((_,P)=>A.data.set([_[0],_[1],_[2],255],P*4)),y.putImageData(A,0,0)}function v(x){let w=x?`${x.w}x${x.h}:${x.levels}:${x.values.join(",")}`:"none";if(w===p)return;p=w;let y=x||{w:1,h:1,values:[0]};a.width=y.w,a.height=y.h;let A=a.getContext("2d"),_=A.createImageData(y.w,y.h);for(let P=0;P<y.values.length;P++)_.data.set([y.values[P],0,0,255],P*4);A.putImageData(_,0,0)}async function k(x,w){let y=x.settings;await b(w),x.quantize&&M(x),v(x.map),(l.width!==x.width||l.height!==x.height)&&l.setSize(x.width,x.height);let A=x.kind==="diffusion",_=new Array(po).fill(null).map((D,F)=>x.kernel&&x.kernel[F]||[0,0,0]);l.set({u_count:x.palette.length||1,u_distance:x.distance,u_resample:y.size.resample==="nearest"?1:0,u_adjust:[y.adjust.brightness,y.adjust.contrast,y.adjust.saturation,y.adjust.gamma],u_hue:y.adjust.hue,u_crop:[x.crop.x,x.crop.y,x.crop.w,x.crop.h],u_alphaCut:y.alpha.threshold,u_mode:x.quantize?x.kind==="ordered"?2:1:0,u_levels:x.map?x.map.levels:1,u_amount:x.map?x.spread*y.dither.strength:0,u_skew:x.skew,u_strength:y.dither.strength,u_kn:x.kernel?x.kernel.length:0,u_kernel:new Float32Array(_.flat()),u_outline:{none:0,outer:1,inner:2}[x.outline.mode],u_corners:x.outline.corners?1:0,u_outlineColor:x.outline.color.map(D=>D/255)}),d("diffuse",{u_on:A?1:0}),d("resolve",{u_on:A?1:0}),d("orphan",{u_on:y.cleanup.orphans?1:0}),d("smooth",{u_on:y.cleanup.smooth?1:0}),l.getPass("diffuse").cfg.iterations=A?x.waves:1;let{data:P}=l.readPixels(),I=x.width,H=x.height,T=new Uint8ClampedArray(I*H*4),O=I*4;for(let D=0;D<H;D++)T.set(P.subarray((H-1-D)*O,(H-D)*O),D*O);return T}return{name:"webgl",renderer:n,software:/swiftshader|llvmpipe|softpipe|software|basic render/i.test(n),run:k,shader:l,destroy(){l.destroy()}}}var Mo=typeof document<"u",oi=e=>e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e&&e.data&&e.data.length===e.width*e.height*4;async function Ds(e){if(typeof Blob<"u"&&e instanceof Blob){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e)}catch{}e=URL.createObjectURL(e)}if(!Mo)throw new Error("Loading images by URL needs a browser; pass { width, height, data } in Node.");let t=new Image;return t.crossOrigin="anonymous",t.decoding="async",t.src=e,await t.decode(),t}function $s(e){return{width:e.naturalWidth||e.videoWidth||e.displayWidth||e.codedWidth||e.width||0,height:e.naturalHeight||e.videoHeight||e.displayHeight||e.codedHeight||e.height||0}}function zs(e){if(e&&!oi(e)&&typeof e=="object"){if(e.canvas&&typeof e.canvas=="object"&&"getContext"in e.canvas)return e.canvas;if(e.elt&&typeof e.elt=="object"&&"getContext"in e.elt)return e.elt}return e}async function ri(e,t={}){let n=t.maxSize||4096,o=zs(e);if((typeof o=="string"||typeof Blob<"u"&&o instanceof Blob)&&(o=await Ds(o)),o&&typeof o.complete=="boolean"&&!o.complete&&o.decode&&await o.decode(),oi(o)){let d={width:o.width,height:o.height,data:o.data,canvas:null};return Mo&&Object.defineProperty(d,"canvas",{configurable:!0,get(){let h=document.createElement("canvas");h.width=o.width,h.height=o.height;let f=new ImageData(new Uint8ClampedArray(o.data),o.width,o.height);return h.getContext("2d").putImageData(f,0,0),Object.defineProperty(d,"canvas",{value:h}),h}}),d}if(!Mo)throw new Error("Unsupported source in a non-browser environment. Pass { width, height, data }.");let{width:i,height:r}=$s(o);if(!i||!r)throw new Error("Source has no size yet (is the image or video loaded?)");let a=Math.min(1,n/Math.max(i,r));i=Math.max(1,Math.round(i*a)),r=Math.max(1,Math.round(r*a));let c=t.canvas||document.createElement("canvas");c.width=i,c.height=r;let l=c.getContext("2d",{willReadFrequently:!0});l.clearRect(0,0,i,r),l.imageSmoothingEnabled=a<1,l.imageSmoothingQuality="high",l.drawImage(o,0,0,i,r);let s=null;return{width:i,height:r,canvas:c,dirty:!0,get data(){return s||(s=l.getImageData(0,0,i,r).data)}}}Jt();Jt();function ci(e,t=1,n={}){let o=t>1||n.grid?jt(e,t,n):e,i=n.canvas||document.createElement("canvas");return i.width=o.width,i.height=o.height,i.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(o.data),o.width,o.height),0,0),i}function vt(e,t,n="application/octet-stream"){let o=e instanceof Blob?e:new Blob([e],{type:n}),i=URL.createObjectURL(o),r=document.createElement("a");r.href=i,r.download=t,r.rel="noopener",document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e4)}var Nn=null;function Gn(e,t=0){if(!Nn){Nn=new Uint32Array(256);for(let n=0;n<256;n++){let o=n;for(let i=0;i<8;i++)o=o&1?3988292384^o>>>1:o>>>1;Nn[n]=o>>>0}}t=~t>>>0;for(let n=0;n<e.length;n++)t=Nn[(t^e[n])&255]^t>>>8;return~t>>>0}Jt();var Bs=[137,80,78,71,13,10,26,10];async function Ns(e){if(typeof CompressionStream=="function"){let n=new CompressionStream("deflate"),o=new Blob([e]).stream().pipeThrough(n);return new Uint8Array(await new Response(o).arrayBuffer())}let{deflateSync:t}=await import("node:zlib");return new Uint8Array(t(e))}function cn(e,t){let n=new Uint8Array(12+t.length),o=new DataView(n.buffer);o.setUint32(0,t.length);for(let i=0;i<4;i++)n[4+i]=e.charCodeAt(i);return n.set(t,8),o.setUint32(8+t.length,Gn(n.subarray(4,8+t.length))),n}function Gs(e){let t=e.data,n=e.width*e.height,o=new Map,i=[],r=new Uint8Array(n);for(let a=0;a<n;a++){let c=a*4,l=t[c+3]===0?-1:(t[c]<<24|t[c+1]<<16|t[c+2]<<8|t[c+3])>>>0,s=o.get(l);if(s===void 0){if(i.length===256)return null;s=i.length,o.set(l,s),i.push(l===-1?[0,0,0,0]:[t[c],t[c+1],t[c+2],t[c+3]])}r[a]=s}return{colors:i,indices:r}}async function Pt(e,t={}){t.width&&t.height?e=ii(e,t.width,t.height):(t.scale&&t.scale>1||t.grid)&&(e=jt(e,t.scale||1,t));let{width:n,height:o}=e,i=t.indexed===!1?null:Gs(e),r=new Uint8Array(13),a=new DataView(r.buffer);a.setUint32(0,n),a.setUint32(4,o);let c=[new Uint8Array(Bs)],l;if(i){let f=i.colors.length<=2?1:i.colors.length<=4?2:i.colors.length<=16?4:8;r.set([f,3,0,0,0],8);let p=Math.ceil(n*f/8);l=new Uint8Array((p+1)*o);for(let b=0;b<o;b++){let M=b*(p+1)+1;for(let v=0;v<n;v++){let k=i.indices[b*n+v],x=v*f;l[M+(x>>3)]|=k<<8-f-(x&7)}}if(c.push(cn("IHDR",r)),c.push(cn("PLTE",Uint8Array.from(i.colors.flatMap(b=>b.slice(0,3))))),i.colors.some(b=>b[3]<255)){let b=i.colors.length;for(;b>0&&i.colors[b-1][3]===255;)b--;c.push(cn("tRNS",Uint8Array.from(i.colors.slice(0,b).map(M=>M[3]))))}}else{r.set([8,6,0,0,0],8),l=new Uint8Array((n*4+1)*o);for(let f=0;f<o;f++)l.set(e.data.subarray?e.data.subarray(f*n*4,(f+1)*n*4):Array.prototype.slice.call(e.data,f*n*4,(f+1)*n*4),f*(n*4+1)+1);c.push(cn("IHDR",r))}c.push(cn("IDAT",await Ns(l))),c.push(cn("IEND",new Uint8Array(0)));let s=c.reduce((f,p)=>f+p.length,0),d=new Uint8Array(s),h=0;for(let f of c)d.set(f,h),h+=f.length;return d}var Hs=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement,js=e=>typeof VideoFrame<"u"&&e instanceof VideoFrame;async function li(e={}){let t=e.backend||"auto",n=null,o=null;if(t!=="cpu"&&typeof document<"u")try{n=await ni()}catch(s){if(o=s,t==="webgl")throw s}let i=typeof document<"u"?document.createElement("canvas"):null,r={source:null,frame:null},a=Promise.resolve();async function c(s){if(s===r.source&&r.frame&&!Hs(s)&&!js(s))return r.frame.dirty=!1,r.frame;let d=await ri(s,{maxSize:e.maxSourceSize,canvas:i});return r={source:s,frame:d},d}async function l(s,d){let h=typeof performance<"u"?performance.now():Date.now(),f=await c(s),p=wr(d,f),b,M="cpu",v=p.kind==="diffusion"&&(e.diffusion==="cpu"||e.diffusion!=="gpu"&&n&&n.software);n&&f.canvas&&!v?(b=await n.run(p,f),M="webgl"):b=vr(p,f);let k=(typeof performance<"u"?performance.now():Date.now())-h;return Vs(p,b,M,k)}return{get backend(){return n?"webgl":"cpu"},get renderer(){return n?n.renderer:""},get fallbackReason(){return o?String(o.message||o):""},process(s,d={}){let h=a.then(()=>l(s,d));return a=h.catch(()=>{}),h},invalidate(){r={source:null,frame:null}},destroy(){n&&n.destroy(),n=null},get shader(){return n?n.shader:null}}}function Vs(e,t,n="cpu",o=0){return{width:e.width,height:e.height,data:t,palette:e.paletteHex?e.paletteHex.slice():null,settings:e.settings,kind:e.kind,waves:e.waves,crop:{x:e.crop.x/e.srcWidth,y:e.crop.y/e.srcHeight,w:e.crop.w/e.srcWidth,h:e.crop.h/e.srcHeight},backend:n,ms:o,usedColors(){return ai(this)},toImageData(){return new ImageData(new Uint8ClampedArray(this.data),this.width,this.height)},toCanvas(r=1,a={}){return ci(this,r,a)},toPNG(r={}){return Pt(this,r)},async toBlob(r={}){return new Blob([await Pt(this,r)],{type:"image/png"})}}}To();mi();Jt();Ot();un();var yn=[{id:"balanced",name:"Balanced",description:"Endesga 32, Bayer 4\xD74. A good first look at most photos.",settings:{size:{width:96},palette:{source:"builtin",id:"endesga-32"},dither:{method:"bayer4",strength:.6}}},{id:"game-boy",name:"Game Boy",description:"Four greens, 160 px wide, ordered dither.",settings:{size:{width:160},palette:{source:"builtin",id:"game-boy-dmg"},dither:{method:"bayer4",strength:1},adjust:{contrast:.15}}},{id:"pico-8",name:"PICO-8",description:"128 px, the PICO-8 palette, blue-noise dither.",settings:{size:{width:128},palette:{source:"builtin",id:"pico-8"},dither:{method:"bluenoise",strength:.7}}},{id:"one-bit",name:"1-bit Atkinson",description:"Classic Mac look: two colours, Atkinson diffusion.",settings:{size:{width:192},palette:{source:"builtin",id:"1-bit-monitor"},dither:{method:"atkinson",strength:1},adjust:{contrast:.2}}},{id:"faithful",name:"Faithful colour",description:"Palette extracted from the image, Floyd\u2013Steinberg.",settings:{size:{width:128},palette:{source:"extract",count:24},dither:{method:"floyd-steinberg",strength:.75}}},{id:"sprite",name:"Clean sprite",description:"No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.",settings:{size:{width:48,resample:"nearest"},palette:{source:"extract",count:12},dither:{method:"none"},cleanup:{orphans:!0},outline:{mode:"outer",color:"#1a1c2c"}}},{id:"cga",name:"CGA",description:"16 hard colours with an 8\xD78 Bayer pattern.",settings:{size:{width:160},palette:{source:"builtin",id:"cga-16"},dither:{method:"bayer8",strength:1}}},{id:"newsprint",name:"Newsprint",description:"Grey clustered-dot halftone.",settings:{size:{width:220},palette:{source:"builtin",id:"grayscale-4"},dither:{method:"cluster8",strength:1},adjust:{saturation:-1}}},{id:"soft",name:"Soft painterly",description:"Resurrect 64 with Sierra Lite and a light smooth.",settings:{size:{width:112},palette:{source:"builtin",id:"resurrect-64"},dither:{method:"sierra-lite",strength:.6},cleanup:{smooth:!0}}}];function m(e,t={},...n){let[o,...i]=e.split("."),r=document.createElement(o||"div");i.length&&(r.className=i.join(" "));for(let[a,c]of Object.entries(t||{}))c==null||c===!1||(a.startsWith("on")&&typeof c=="function"?r.addEventListener(a.slice(2),c):a==="html"?r.innerHTML=c:a==="text"?r.textContent=c:a==="style"&&typeof c=="object"?Object.assign(r.style,c):a==="dataset"?Object.assign(r.dataset,c):a in r&&typeof c!="string"&&a!=="list"?r[a]=c:r.setAttribute(a,c===!0?"":c));return wi(r,n),r}function wi(e,t){for(let n of t.flat(1/0))n==null||n===!1||e.append(n instanceof Node?n:document.createTextNode(String(n)));return e}function At(e,...t){return e.replaceChildren(),wi(e,t)}var Qs=0,Qt=(e="itp")=>`${e}-${++Qs}`;function jn({accept:e="",multiple:t=!1}={}){return new Promise(n=>{let o=m("input",{type:"file",accept:e,multiple:t,style:{display:"none"}});o.addEventListener("change",()=>{n([...o.files]),o.remove()}),o.addEventListener("cancel",()=>{n([]),o.remove()}),document.body.append(o),o.click()})}var vi={upload:'<path d="M12 15V4m0 0-4 4m4-4 4 4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',download:'<path d="M12 4v11m0 0-4-4m4 4 4-4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',image:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><circle cx="9" cy="10" r="1.6"/><path d="m4 17 5-4.5 4 3.5 3-2.5 4 3.5"/>',film:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M7.5 4.5v15M16.5 4.5v15M3.5 9h4M3.5 15h4M16.5 9h4M16.5 15h4"/>',files:'<path d="M8 7V5.5A1.5 1.5 0 0 1 9.5 4H15l4 4v8.5a1.5 1.5 0 0 1-1.5 1.5H16"/><rect x="4.5" y="7" width="11.5" height="13" rx="1.5"/>',presets:'<rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><path d="M16.5 13.5v6M13.5 16.5h6"/>',palette:'<path d="M12 3.5a8.5 8.5 0 1 0 0 17c1.2 0 1.8-.9 1.4-2l-.3-.8c-.4-1.2.5-2.2 1.7-2.2h1.7a4 4 0 0 0 4-4c0-4.4-3.8-8-8.5-8Z"/><circle cx="8" cy="11" r="1"/><circle cx="11" cy="7.5" r="1"/><circle cx="15.5" cy="8.5" r="1"/>',search:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5"/>',x:'<path d="M6 6l12 12M18 6 6 18"/>',plus:'<path d="M12 5v14M5 12h14"/>',minus:'<path d="M5 12h14"/>',chevron:'<path d="m9.5 6 6 6-6 6"/>',chevronDown:'<path d="m6 9.5 6 6 6-6"/>',undo:'<path d="M9 7 4.5 11.5 9 16"/><path d="M5 11.5h9.5a5 5 0 0 1 0 10H11"/>',redo:'<path d="m15 7 4.5 4.5L15 16"/><path d="M19 11.5H9.5a5 5 0 0 0 0 10H13"/>',compare:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 2.5v19"/><path d="M15 9.5l2 2.5-2 2.5"/><path d="M9 9.5 7 12l2 2.5"/>',grid:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M9.2 3.5v17M14.8 3.5v17M3.5 9.2h17M3.5 14.8h17"/>',fit:'<path d="M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15"/>',zoomIn:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M11 8.5v5M8.5 11h5"/>',zoomOut:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M8.5 11h5"/>',sun:'<circle cx="12" cy="12" r="3.5"/><path d="M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4"/>',moon:'<path d="M19.5 14.5A7.5 7.5 0 0 1 9.5 4.5a7.5 7.5 0 1 0 10 10Z"/>',sidebarLeft:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M9.5 4.5v15"/>',sidebarRight:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M14.5 4.5v15"/>',play:'<path d="M8 5.5v13l10.5-6.5L8 5.5Z"/>',pause:'<path d="M8.5 5.5v13M15.5 5.5v13"/>',stepBack:'<path d="M7 5.5v13M18 6l-8 6 8 6V6Z"/>',stepForward:'<path d="M17 5.5v13M6 6l8 6-8 6V6Z"/>',save:'<path d="M5 4.5h11l3.5 3.5v10A1.5 1.5 0 0 1 18 19.5H6A1.5 1.5 0 0 1 4.5 18V6A1.5 1.5 0 0 1 6 4.5Z"/><path d="M8 4.5v4h7v-4M8 19.5v-6h8v6"/>',rename:'<path d="M4 20h4L19 9l-4-4L4 16v4Z"/><path d="m13.5 6.5 4 4"/>',volume:'<path d="M4 9.5h3.5L12 6v12l-4.5-3.5H4z"/><path d="M15.5 9.5a3.5 3.5 0 0 1 0 5M18 7a7 7 0 0 1 0 10"/>',volumeOff:'<path d="M4 9.5h3.5L12 6v12l-4.5-3.5H4z"/><path d="m16 9.5 5 5M21 9.5l-5 5"/>',trash:'<path d="M4.5 7h15M9.5 7V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M6.5 7l1 12a1.5 1.5 0 0 0 1.5 1.4h6a1.5 1.5 0 0 0 1.5-1.4l1-12"/>',link:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/>',braces:'<path d="M8.5 4.5H8A2 2 0 0 0 6 6.5v3A2.5 2.5 0 0 1 3.5 12 2.5 2.5 0 0 1 6 14.5v3a2 2 0 0 0 2 2h.5M15.5 4.5h.5a2 2 0 0 1 2 2v3a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0-2.5 2.5v3a2 2 0 0 1-2 2h-.5"/>',pipette:'<path d="m14.5 6.5 3 3M12 9l-7.2 7.2a2 2 0 0 0-.5 1V20h2.8a2 2 0 0 0 1-.5L15.2 12"/><path d="M13 7.5 15.8 4.7a2.3 2.3 0 0 1 3.3 3.3L16.3 10.8 13 7.5Z"/>',check:'<path d="m5 12.5 4.5 4.5L19 7.5"/>',keyboard:'<rect x="2.5" y="6" width="19" height="12" rx="2"/><path d="M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M8 14h8"/>',reset:'<path d="M4.5 12a7.5 7.5 0 1 0 2.2-5.3L4.5 9"/><path d="M4.5 4.5V9H9"/>',sheet:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M3.5 12h17M12 3.5v17"/>',tiles:'<rect x="3.5" y="3.5" width="7" height="7" rx="1"/><rect x="13.5" y="3.5" width="7" height="7" rx="1"/><rect x="3.5" y="13.5" width="7" height="7" rx="1"/><path d="M13.5 17h7M17 13.5v7"/>',zip:'<path d="M6 3.5h8l4.5 4.5v11a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 19V5A1.5 1.5 0 0 1 6 3.5Z"/><path d="M10 3.5v2h2v2h-2v2h2v2h-2v3"/>',gif:'<rect x="3.5" y="5.5" width="17" height="13" rx="2"/><path d="M10 10.5H8.5a1.5 1.5 0 0 0 0 3H10V12M13 10v4M16 14v-4h2M16 12h1.5"/>',more:'<circle cx="6" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="18" cy="12" r="1"/>',menu:'<path d="M4 7h16M4 12h16M4 17h16"/>',sliders:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',info:'<circle cx="12" cy="12" r="8.5"/><path d="M12 11v5M12 8h.01"/>',unlink:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/><path d="M4 4l16 16"/>',arrowUp:'<path d="M12 19V5M6 11l6-6 6 6"/>',arrowDown:'<path d="M12 5v14M6 13l6 6 6-6"/>',layers:'<path d="m12 4 8.5 4.5L12 13 3.5 8.5 12 4Z"/><path d="m3.5 12.5 8.5 4.5 8.5-4.5"/><path d="m3.5 16.5 8.5 4.5 8.5-4.5"/>',frame:'<path d="M7 3v14a1 1 0 0 0 1 1h13"/><path d="M3 7h13a1 1 0 0 1 1 1v13"/>',copy:'<rect x="8.5" y="8.5" width="11" height="11" rx="1.5"/><path d="M15.5 8.5V6A1.5 1.5 0 0 0 14 4.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5"/>',clipboard:'<rect x="5" y="4.5" width="14" height="16" rx="2"/><path d="M9 4.5V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v.5M9 10h6M9 14h4"/>',github:'<path d="M9 19c-4 1.3-4-2-5.5-2.5M14.5 21v-3.2c0-1 .1-1.4-.5-2 2.6-.3 5.5-1.3 5.5-5.8a4.5 4.5 0 0 0-1.2-3.1 4.2 4.2 0 0 0-.1-3.1s-1-.3-3.3 1.2a11.4 11.4 0 0 0-6 0C6.6 3.5 5.6 3.8 5.6 3.8a4.2 4.2 0 0 0-.1 3.1A4.5 4.5 0 0 0 4.3 10c0 4.5 2.9 5.5 5.5 5.8-.6.6-.6 1.2-.5 2V21"/>'};function ie(e,t=""){return`<svg class="i ${t}" viewBox="0 0 24 24" aria-hidden="true" focusable="false">${vi[e]||""}</svg>`}var Fl=Object.keys(vi);function Ei(e){let t=Tt(e),n="shared",o=[],i=[],r=new Map,a=new Set,c=null,l=0,s=200,d=f=>{for(let p of a)p(t,f)},h=(f,p)=>JSON.stringify(f)===JSON.stringify(p);return{get settings(){return t},get target(){return n},subscribe(f){return a.add(f),()=>a.delete(f)},update(f,p={}){let b=Ht(t,f);if(h(b,t))return;let M=Date.now(),v=p.key&&p.key===c&&M-l<1200;p.history!==!1&&!v&&(o.push(t),o.length>s&&o.shift(),i.length=0),c=p.key||null,l=M,t=b,d("update")},replace(f,p="replace"){f=Tt(f),!h(f,t)&&(o.push(t),i.length=0,c=null,t=f,d(p))},setTarget(f,p){r.set(n,{past:o,future:i}),n=f;let b=r.get(f)||{past:[],future:[]};o=b.past,i=b.future,c=null,t=Tt(p),d("target")},dropTarget(f){f!==n&&r.delete(f)},commit(){c=null},undo(){return o.length?(i.push(t),t=o.pop(),c=null,d("undo"),!0):!1},redo(){return i.length?(o.push(t),t=i.pop(),c=null,d("redo"),!0):!1},get canUndo(){return o.length>0},get canRedo(){return i.length>0}}}var xn=[.25,.5,1,2,3,4,6,8,12,16,24,32,48,64];function ki({onPick:e,onViewChange:t}={}){let n=m("canvas.screen",{role:"img","aria-label":"Preview"}),o=m("span.lbl.l",{text:"Original"}),i=m("span.lbl.r",{text:"Pixel"}),r=m("button",{type:"button","aria-label":"Drag to compare original and result",html:ie("compare")}),a=m("div.itp-split",{hidden:!0},o,i,r),c=m("div.itp-view",{tabindex:"0","aria-label":"Canvas. Scroll to zoom, drag to pan."},n,a),l=n.getContext("2d"),s={result:null,original:null,crop:null,w:0,h:0,x:0,y:0,z:1,fitted:!0,compare:!1,splitAt:.5,grid:!1,picking:!1},d=1,h=0,f=0,p=null,b="";function M(){let T=getComputedStyle(c),O=T.getPropertyValue("--checker-a").trim()||"#1a1b1f",D=T.getPropertyValue("--checker-b").trim()||"#222",F=O+D;if(F===b)return p;let G=document.createElement("canvas");G.width=G.height=16;let N=G.getContext("2d");return N.fillStyle=O,N.fillRect(0,0,16,16),N.fillStyle=D,N.fillRect(0,0,8,8),N.fillRect(8,8,8,8),b=F,p=l.createPattern(G,"repeat"),p}function v(){let T=c.getBoundingClientRect(),O=Math.min(3,window.devicePixelRatio||1);if(Math.abs(T.width-h)<.5&&Math.abs(T.height-f)<.5&&O===d&&n.width>1){A();return}d=O,h=T.width,f=T.height,n.width=Math.max(1,Math.round(h*d)),n.height=Math.max(1,Math.round(f*d)),s.fitted?x(!1):A()}function k(){if(!s.w)return 1;let T=h<600?16:48;return Math.max(.05,Math.min((h-T)/s.w,(f-T)/s.h))}function x(T=!0){s.z=k(),s.x=(h-s.w*s.z)/2,s.y=(f-s.h*s.z)/2,s.fitted=!0,A(),T&&t&&t(H())}function w(T,O=h/2,D=f/2){T=Math.max(.05,Math.min(128,T));let F=(O-s.x)/s.z,G=(D-s.y)/s.z;s.z=T,s.x=O-F*T,s.y=D-G*T,s.fitted=!1,A(),t&&t(H())}function y(T,O,D){let F=s.z,G;T>0?G=xn.find(N=>N>F+1e-6)||F*1.5:G=[...xn].reverse().find(N=>N<F-1e-6)||F/1.5,w(G,O,D)}function A(){if(l.setTransform(1,0,0,1,0,0),l.clearRect(0,0,n.width,n.height),!s.result){a.hidden=!0;return}l.setTransform(d,0,0,d,0,0);let T=Math.round(s.x*d)/d,O=Math.round(s.y*d)/d,D=Math.round(s.w*s.z*d)/d,F=Math.round(s.h*s.z*d)/d;if(l.fillStyle=M(),l.fillRect(T,O,D,F),l.imageSmoothingEnabled=!1,l.drawImage(s.result,T,O,D,F),s.compare&&s.original){let G=T+D*s.splitAt;l.save(),l.beginPath(),l.rect(T,O,Math.max(0,G-T),F),l.clip(),l.fillStyle=M(),l.fillRect(T,O,D,F),l.imageSmoothingEnabled=!0,l.imageSmoothingQuality="high";try{let N=s.original.naturalWidth||s.original.videoWidth||s.original.width,ve=s.original.naturalHeight||s.original.videoHeight||s.original.height,ke=s.crop||{x:0,y:0,w:1,h:1};l.drawImage(s.original,ke.x*N,ke.y*ve,ke.w*N,ke.h*ve,T,O,D,F)}catch{}l.restore(),a.hidden=!1,a.style.left=`${G}px`,a.style.top=`${Math.max(0,O)}px`,a.style.bottom=`${Math.max(0,f-(O+F))}px`}else a.hidden=!0;if(s.grid&&s.z>=6){l.save(),l.beginPath(),l.rect(T,O,D,F),l.clip(),l.strokeStyle="rgba(127,127,127,0.35)",l.lineWidth=1/d,l.beginPath();let G=Math.max(0,Math.floor(-s.x/s.z)),N=Math.min(s.w,Math.ceil((h-s.x)/s.z)),ve=Math.max(0,Math.floor(-s.y/s.z)),ke=Math.min(s.h,Math.ceil((f-s.y)/s.z));for(let fe=G;fe<=N;fe++){let se=Math.round((T+fe*s.z)*d)/d+.5/d;l.moveTo(se,Math.max(O,0)),l.lineTo(se,Math.min(O+F,f))}for(let fe=ve;fe<=ke;fe++){let se=Math.round((O+fe*s.z)*d)/d+.5/d;l.moveTo(Math.max(T,0),se),l.lineTo(Math.min(T+D,h),se)}l.stroke(),l.restore()}}let _=null,P=new Map;c.addEventListener("pointerdown",T=>{if(!(T.target===r||r.contains(T.target))&&!(T.target!==c&&T.target!==n)){if(c.focus({preventScroll:!0}),P.set(T.pointerId,{x:T.clientX,y:T.clientY}),c.setPointerCapture(T.pointerId),s.picking&&T.button===0&&P.size===1){let O=c.getBoundingClientRect(),D=(T.clientX-O.left-s.x)/(s.w*s.z),F=(T.clientY-O.top-s.y)/(s.h*s.z);D>=0&&F>=0&&D<1&&F<1&&e&&e(D,F);return}_={x:T.clientX,y:T.clientY,ox:s.x,oy:s.y},c.classList.add("panning")}}),c.addEventListener("pointermove",T=>{if(!P.has(T.pointerId))return;let O=P.get(T.pointerId);if(P.set(T.pointerId,{x:T.clientX,y:T.clientY}),P.size===2){let[D,F]=[...P.values()],G=[...P.entries()].find(([ke])=>ke!==T.pointerId)[1],N=Math.hypot(O.x-G.x,O.y-G.y),ve=Math.hypot(D.x-F.x,D.y-F.y);if(N>0){let ke=c.getBoundingClientRect();w(s.z*ve/N,(D.x+F.x)/2-ke.left,(D.y+F.y)/2-ke.top)}_=null;return}_&&(s.x=_.ox+T.clientX-_.x,s.y=_.oy+T.clientY-_.y,s.fitted=!1,A())});let I=T=>{P.delete(T.pointerId),P.size||(_=null,c.classList.remove("panning"),t&&t(H()))};c.addEventListener("pointerup",I),c.addEventListener("pointercancel",I),c.addEventListener("wheel",T=>{T.preventDefault();let O=c.getBoundingClientRect(),D=T.clientX-O.left,F=T.clientY-O.top;if(!T.ctrlKey&&T.deltaMode===0&&Math.abs(T.deltaX)>0){s.x-=T.deltaX,s.y-=T.deltaY,s.fitted=!1,A();return}T.ctrlKey&&T.deltaMode===0?w(s.z*Math.exp(-T.deltaY*.01),D,F):y(T.deltaY<0?1:-1,D,F)},{passive:!1}),c.addEventListener("dblclick",()=>x()),r.addEventListener("pointerdown",T=>{T.preventDefault(),r.setPointerCapture(T.pointerId);let O=F=>{let G=c.getBoundingClientRect();s.splitAt=Math.min(1,Math.max(0,(F.clientX-G.left-s.x)/(s.w*s.z))),A()},D=()=>{r.removeEventListener("pointermove",O),r.removeEventListener("pointerup",D)};r.addEventListener("pointermove",O),r.addEventListener("pointerup",D)}),r.addEventListener("keydown",T=>{(T.key==="ArrowLeft"||T.key==="ArrowRight")&&(T.preventDefault(),T.stopPropagation(),s.splitAt=Math.min(1,Math.max(0,s.splitAt+(T.key==="ArrowLeft"?-.05:.05))),A())}),new ResizeObserver(v).observe(c);let H=()=>({zoom:s.z,fitted:s.fitted,x:s.x,y:s.y});return{el:c,show(T,O,D){let F=!s.result||T.width!==s.w||T.height!==s.h,G={w:s.w*s.z,cx:s.x+s.w*s.z/2,cy:s.y+s.h*s.z/2};if(s.result=T,s.original=O||s.original,s.crop=D||null,F)if(s.w=T.width,s.h=T.height,s.fitted||!G.w)x();else{let N=G.w/s.w;s.z=N,s.x=G.cx-s.w*N/2,s.y=G.cy-s.h*N/2,A(),t&&t(H())}else A()},clear(){s.result=null,s.original=null,s.w=s.h=0,s.fitted=!0,A()},fit:x,zoomTo:w,zoomStep:y,zoomIn(){y(1)},zoomOut(){y(-1)},get zoom(){return s.z},get fitted(){return s.fitted},get rect(){return{x:s.x,y:s.y,width:s.w*s.z,height:s.h*s.z,zoom:s.z}},setCompare(T){s.compare=T,A()},get compare(){return s.compare},setGrid(T){s.grid=T,A()},get grid(){return s.grid},setPicking(T){s.picking=T,c.classList.toggle("picking",T)},get picking(){return s.picking},redraw:A,resize:v}}function Mi(e,t={},...n){let o=Qt("sec"),i=m("span.hint",{}),r=m("button.itp-sec-toggle",{type:"button","aria-controls":o},m("span.title",{text:e}),i,m("span.chev",{html:ie("chevron")})),a=t.onReset?m("button.itp-btn.small.icon.itp-sec-reset",{type:"button",hidden:!0,title:t.resetLabel||`Reset ${e.toLowerCase()}`,"aria-label":t.resetLabel||`Reset ${e.toLowerCase()} to defaults`,html:ie("reset"),onclick:()=>t.onReset()}):null,c=m("div.body",{id:o},...n),l=m("section.itp-sec",{},m("div.itp-sec-head",{},r,a),c),s=d=>{l.dataset.open=String(d),r.setAttribute("aria-expanded",String(d)),c.hidden=!d};return r.addEventListener("click",()=>{let d=l.dataset.open!=="true";s(d),t.onToggle?.(d)}),s(t.open!==!1),{el:l,body:c,setHint(d){i.textContent=d},setChanged(d){a&&(a.hidden=!d)},setOpen:s,get open(){return l.dataset.open==="true"}}}function Bt(e,t,{help:n="",value:o=null,id:i}={}){let r=m("div.lab",{},m("label",{for:i||t.id||null,text:e}),o);return m("div.itp-field",{},r,t,n?m("div.help",{text:n}):null)}function ht(e){let t=Qt("sl"),n=e.scale||1,o=e.step||1,i=m("input",{type:"range",id:t,min:e.min*n,max:e.max*n,step:o*n,"aria-label":e.label}),r=m("input.itp-input",{type:"number",min:e.min*n,max:e.max*n,step:o*n,"aria-label":`${e.label} value`}),a=()=>{let s=(i.value-i.min)/(i.max-i.min)*100;i.style.setProperty("--p",`${s}%`)},c=s=>{let d=ec(s*n,o*n);i.value=d,r.value=d,a()};return i.addEventListener("input",()=>{r.value=i.value,a(),e.onInput(Number(i.value)/n)}),i.addEventListener("change",()=>e.onCommit&&e.onCommit()),r.addEventListener("change",()=>{let s=Math.min(e.max*n,Math.max(e.min*n,Number(r.value)||0));c(s/n),e.onInput(s/n),e.onCommit&&e.onCommit()}),i.addEventListener("dblclick",()=>{e.reset!=null&&(c(e.reset),e.onInput(e.reset),e.onCommit&&e.onCommit())}),c(e.value),{el:Bt(e.label,m("div.itp-slider",{},i,r),{help:e.help,id:t}),set:c,input:i}}var ec=(e,t)=>{let n=Math.max(0,-Math.floor(Math.log10(t)+1e-9));return Number((Math.round(e/t)*t).toFixed(n))};function Xt(e){let t=Qt("se"),n=m("select.itp-select",{id:t,"aria-label":e.label}),o=new Map;for(let r of e.options){let a=m("option",{value:r.value,text:r.label});if(r.group){if(!o.has(r.group)){let c=m("optgroup",{label:r.group});o.set(r.group,c),n.append(c)}o.get(r.group).append(a)}else n.append(a)}return n.addEventListener("change",()=>e.onChange(n.value)),{el:e.bare?n:Bt(e.label,n,{help:e.help,id:t}),select:n,set(r){n.value=r}}}function en(e){let t=e.options.map(r=>m("button",{type:"button","aria-pressed":"false",title:r.title||null,html:(r.icon?ie(r.icon):"")+(r.label?`<span>${r.label}</span>`:""),onclick:()=>e.onChange(r.value)})),n=m("div.itp-seg",{role:"group","aria-label":e.label},...t),o=r=>t.forEach((a,c)=>a.setAttribute("aria-pressed",String(e.options[c].value===r)));return o(e.value),{el:e.bare?n:Bt(e.label,n,{help:e.help}),set:o}}function Nt(e){let t=m("input",{type:"checkbox",role:"switch"});t.addEventListener("change",()=>e.onChange(t.checked));let n=m("label.itp-switch",{},m("span",{text:e.label}),t);return{el:e.help?m("div.itp-field",{},n,m("div.help",{text:e.help})):n,set(i){t.checked=!!i}}}function Si(e){let t=m("input",{type:"color","aria-label":e.label}),n=m("span.mono",{});t.addEventListener("input",()=>{n.textContent=t.value,e.onChange(t.value)});let o=m("label.itp-color",{},t,n),i=r=>{t.value=r,n.textContent=r};return i(e.value||"#000000"),{el:e.bare?o:Bt(e.label,o),set:i}}function tn(e){let t=Qt("nu"),n=m("input.itp-input.num",{type:"number",id:t,min:e.min,max:e.max,step:e.step||1,"aria-label":e.label});return n.addEventListener("change",()=>{let o=Math.min(e.max,Math.max(e.min,Number(n.value)||e.min));(n.value!==""||!n.placeholder)&&(n.value=o),e.onChange(o)}),{el:e.bare?n:Bt(e.label,n,{help:e.help,id:t}),input:n,set(o){n.value=o}}}Jt();Ot();var Lo=class{constructor(){this.buf=new Uint8Array(65536),this.n=0}byte(t){if(this.n===this.buf.length){let n=new Uint8Array(this.buf.length*2);n.set(this.buf),this.buf=n}this.buf[this.n++]=t}bytes(t){for(let n=0;n<t.length;n++)this.byte(t[n])}u16(t){this.byte(t&255),this.byte(t>>8&255)}str(t){for(let n=0;n<t.length;n++)this.byte(t.charCodeAt(n))}result(){return this.buf.slice(0,this.n)}};function tc(e,t,n){let o=1<<t,i=o+1,r=t+1,a=i+1,c=new Map,l=0,s=0,d=[],h=[],f=b=>{for(l|=b<<s,s+=r;s>=8;)h.push(l&255),l>>>=8,s-=8,h.length===255&&(d.push(h),h=[])};f(o);let p=e[0];for(let b=1;b<e.length;b++){let M=e[b],v=p*256+M,k=c.get(v);if(k!==void 0){p=k;continue}f(p),a<4096?(c.set(v,a++),a>1<<r&&r<12&&r++):(f(o),c=new Map,r=t+1,a=i+1),p=M}f(p),f(i),s>0&&h.push(l&255),h.length&&d.push(h),n.byte(t);for(let b of d)n.byte(b.length),n.bytes(b);n.byte(0)}var _o=(e,t)=>e[t+3]<128?-1:e[t]<<16|e[t+1]<<8|e[t+2];function Ci(e,t){let n=[...e].filter(c=>c!==-1),o=n.map(c=>[c>>16,c>>8&255,c&255]),i=t?o.length:-1;t&&o.push([0,0,0]);let r=1;for(;1<<r<o.length;)r++;for(;o.length<1<<r;)o.push([0,0,0]);let a=new Map(n.map((c,l)=>[c,l]));return{colors:o,bits:r,tIndex:i,index:a}}function nc(e,t){let n=Un(e,t).map(Ft),o=new Uint8ClampedArray(e.data),i=new Map;for(let r=0;r<o.length;r+=4){if(o[r+3]<128)continue;let a=o[r]<<16|o[r+1]<<8|o[r+2],c=i.get(a);if(c===void 0){let l=1/0;c=0;for(let s=0;s<n.length;s++){let d=o[r]-n[s][0],h=o[r+1]-n[s][1],f=o[r+2]-n[s][2],p=d*d*3+h*h*4+f*f*2;p<l&&(l=p,c=s)}i.set(a,c)}o.set(n[c],r)}return{...e,data:o}}function Ti(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(1,Math.round(t.scale||1)),o=e.map(p=>({...n>1?jt(p,n):p,delay:p.delay??t.delay??100})),i=o[0].width,r=o[0].height,a=!1,c=new Set,l=o.map(p=>{let b=new Set;for(let M=0;M<p.data.length;M+=4){let v=_o(p.data,M);v===-1&&(a=!0),b.add(v),c.add(v)}return b}),s=p=>p.size-(p.has(-1)?1:0),h=s(c)+(a?1:0)<=256?Ci(c,a):null,f=new Lo;if(f.str("GIF89a"),f.u16(i),f.u16(r),f.byte(h?240|h.bits-1:0),f.byte(0),f.byte(0),h)for(let p of h.colors)f.bytes(p);return o.length>1&&t.loop!==-1&&(f.byte(33),f.byte(255),f.byte(11),f.str("NETSCAPE2.0"),f.byte(3),f.byte(1),f.u16(t.loop||0),f.byte(0)),o.forEach((p,b)=>{let M=p,v=h,k=l[b];if(!v){let w=a?255:256;if(s(k)>w){M=nc(p,w),k=new Set;for(let y=0;y<M.data.length;y+=4)k.add(_o(M.data,y))}v=Ci(k,k.has(-1))}if(f.byte(33),f.byte(249),f.byte(4),f.byte((a?2:1)<<2|(v.tIndex>=0?1:0)),f.u16(Math.max(2,Math.round(M.delay/10))),f.byte(v.tIndex>=0?v.tIndex:0),f.byte(0),f.byte(44),f.u16(0),f.u16(0),f.u16(i),f.u16(r),f.byte(v===h?0:128|v.bits-1),v!==h)for(let w of v.colors)f.bytes(w);let x=new Uint8Array(i*r);for(let w=0;w<x.length;w++){let y=_o(M.data,w*4);x[w]=y===-1?v.tIndex:v.index.get(y)}tc(x,Math.max(2,v.bits),f)}),f.byte(59),f.result()}var Ai=new TextEncoder;function wn(e){let t=[],n=[],o=0,i=new Set;for(let d of e){let h=d.name.replace(/\\/g,"/").replace(/^\/+/,"");if(i.has(h)){let _=/^(.*?)(\.[^.]*)?$/.exec(h),P=2;for(;i.has(`${_[1]}-${P}${_[2]||""}`);)P++;h=`${_[1]}-${P}${_[2]||""}`}i.add(h);let f=Ai.encode(h),p=typeof d.data=="string"?Ai.encode(d.data):d.data,b=Gn(p),M=d.date||new Date,v=M.getHours()<<11|M.getMinutes()<<5|M.getSeconds()>>1,k=M.getFullYear()-1980<<9|M.getMonth()+1<<5|M.getDate(),x=new Uint8Array(30+f.length),w=new DataView(x.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,2048,!0),w.setUint16(8,0,!0),w.setUint16(10,v,!0),w.setUint16(12,k,!0),w.setUint32(14,b,!0),w.setUint32(18,p.length,!0),w.setUint32(22,p.length,!0),w.setUint16(26,f.length,!0),w.setUint16(28,0,!0),x.set(f,30);let y=new Uint8Array(46+f.length),A=new DataView(y.buffer);A.setUint32(0,33639248,!0),A.setUint16(4,20,!0),A.setUint16(6,20,!0),A.setUint16(8,2048,!0),A.setUint16(10,0,!0),A.setUint16(12,v,!0),A.setUint16(14,k,!0),A.setUint32(16,b,!0),A.setUint32(20,p.length,!0),A.setUint32(24,p.length,!0),A.setUint16(28,f.length,!0),A.setUint32(42,o,!0),y.set(f,46),t.push(x,p),n.push(y),o+=x.length+p.length}let r=n.reduce((d,h)=>d+h.length,0),a=new Uint8Array(22),c=new DataView(a.buffer);c.setUint32(0,101010256,!0),c.setUint16(8,e.length,!0),c.setUint16(10,e.length,!0),c.setUint32(12,r,!0),c.setUint32(16,o,!0);let l=new Uint8Array(o+r+22),s=0;for(let d of[...t,...n,a])l.set(d,s),s+=d.length;return l}var Po=(e,t)=>({width:e,height:t,data:new Uint8ClampedArray(e*t*4)});function oc(e,t,n,o,i=0,r=0,a=t.width,c=t.height){for(let l=0;l<c;l++){let s=((r+l)*t.width+i)*4,d=((o+l)*e.width+n)*4;e.data.set(t.data.subarray?t.data.subarray(s,s+a*4):Array.prototype.slice.call(t.data,s,s+a*4),d)}}function Ro(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(0,t.padding|0),o=Math.max(...e.map(f=>f.width)),i=Math.max(...e.map(f=>f.height)),r=Math.max(1,Math.min(e.length,t.columns||Math.ceil(Math.sqrt(e.length)))),a=Math.ceil(e.length/r),c=r*o+(r-1)*n,l=a*i+(a-1)*n,s=Po(c,l),d={};e.forEach((f,p)=>{let b=p%r*(o+n),M=Math.floor(p/r)*(i+n);oc(s,f,b,M),d[f.name||`frame-${String(p).padStart(3,"0")}`]={frame:{x:b,y:M,w:f.width,h:f.height},sourceSize:{w:f.width,h:f.height},...f.delay!=null?{duration:Math.round(f.delay)}:{}}});let h={frames:d,meta:{app:"image-to-pixel",image:(t.name||"sheet")+".png",size:{w:c,h:l},scale:"1",columns:r,rows:a,padding:n}};return{image:s,atlas:h}}function _i(e,t={}){let n=Math.max(1,t.tileWidth||8),o=Math.max(1,t.tileHeight||n),i=Math.ceil(e.width/n),r=Math.ceil(e.height/o),a=[],c=new Map,l=[],s=[],d=(b,M)=>{let v=Po(n,o);for(let k=0;k<o;k++)for(let x=0;x<n;x++){let w=b*n+x,y=M*o+k;if(w>=e.width||y>=e.height)continue;let A=(y*e.width+w)*4;v.data.set([e.data[A],e.data[A+1],e.data[A+2],e.data[A+3]],(k*n+x)*4)}return v},h=b=>{let M="";for(let v=0;v<b.data.length;v+=4)M+=b.data[v+3]===0?".":String.fromCharCode(b.data[v]+1,b.data[v+1]+1,b.data[v+2]+1);return M},f=(b,M,v)=>{let k=Po(n,o);for(let x=0;x<o;x++)for(let w=0;w<n;w++){let y=((v?o-1-x:x)*n+(M?n-1-w:w))*4;k.data.set(b.data.subarray(y,y+4),(x*n+w)*4)}return k};for(let b=0;b<r;b++)for(let M=0;M<i;M++){let v=d(M,b),k=c.get(h(v)),x=0;if(k===void 0&&t.flips)for(let[w,y,A]of[[1,0,1],[0,1,2],[1,1,3]]){let _=c.get(h(f(v,w,y)));if(_!==void 0){k=_,x=A;break}}k===void 0&&(k=a.length,a.push(v),c.set(h(v),k)),l.push(k),s.push(x)}return{image:Ro(a,{columns:t.columns||Math.min(16,a.length)}).image,map:{width:i,height:r,tileWidth:n,tileHeight:o,tiles:l,...t.flips?{flips:s}:{}},count:a.length}}un();var rc=null,ic=()=>rc||(rc=document.body.appendChild(m("div.itp-toasts.itp",{role:"status","aria-live":"polite"})));function Q(e,t={}){let n=t.kind||"info",o=m("div.msg",{},m("div",{text:e})),i=t.progress?m("div.itp-progress",{},m("i")):null;i&&o.append(i);let r=m(`div.itp-toast.${n}`,{},t.progress?m("div.itp-spinner"):m("span.itp-dot"),o);t.action&&r.append(m("button.itp-btn.small.outline",{type:"button",text:t.action.label,onclick:()=>{t.action.onClick(),c()}})),t.onCancel?r.append(m("button.itp-btn.small",{type:"button",text:"Cancel",onclick:()=>{t.onCancel(),c()}})):r.append(m("button.itp-btn.small.icon",{type:"button","aria-label":"Dismiss",html:ie("x"),onclick:()=>c()})),ic().append(r);let a=null,c=()=>{clearTimeout(a),r.remove()};return(s=>{clearTimeout(a),s&&(a=setTimeout(c,s))})(t.timeout??(t.progress?0:n==="error"?7e3:3200)),{update(s){o.firstChild.textContent=s},progress(s){i&&(i.firstChild.style.width=`${Math.round(s*100)}%`)},close:c,done(s,d="ok"){c(),Q(s,{kind:d})}}}var dn=null;function vn(e,t,{align:n="end"}={}){nn();let o=m("div.itp-menu.itp",{role:"menu"});for(let f of t){if(f==="sep"){o.append(m("hr"));continue}if(f.group){o.append(m("div.mlabel",{text:f.group}));continue}let p=m("button.mi",{type:"button",role:"menuitem",disabled:!!f.disabled},m("span",{html:f.icon?ie(f.icon):""}),m("span",{},f.label,f.sub?m("small",{text:f.sub}):null),f.kbd?m("kbd",{text:f.kbd}):m("span"));p.addEventListener("click",()=>{nn(),f.onClick()}),o.append(p)}document.body.append(o);let i=e.getBoundingClientRect(),r=o.offsetWidth,a=o.offsetHeight,c=n==="end"?i.right-r:i.left;c=Math.max(8,Math.min(c,innerWidth-r-8));let l=i.bottom+6;l+a>innerHeight-8&&(l=Math.max(8,i.top-a-6)),Object.assign(o.style,{left:`${c}px`,top:`${l}px`}),e.setAttribute("aria-expanded","true");let s=[...o.querySelectorAll("button.mi:not(:disabled)")];s[0]?.focus();let d=f=>{let p=s.indexOf(document.activeElement);f.key==="Escape"?(f.preventDefault(),nn(),e.focus()):f.key==="ArrowDown"?(f.preventDefault(),s[(p+1)%s.length]?.focus()):f.key==="ArrowUp"?(f.preventDefault(),s[(p-1+s.length)%s.length]?.focus()):f.key==="Tab"&&nn()},h=f=>{!o.contains(f.target)&&f.target!==e&&!e.contains(f.target)&&nn()};o.addEventListener("keydown",d),setTimeout(()=>document.addEventListener("pointerdown",h,!0)),dn={el:o,anchor:e,cleanup:()=>document.removeEventListener("pointerdown",h,!0)}}function nn(){dn&&(dn.cleanup(),dn.el.remove(),dn.anchor.setAttribute("aria-expanded","false"),dn=null)}function En(e,t,{actions:n=[],onClose:o}={}){let i=m("div.content",{},t),r=m("dialog.itp-dialog.itp",{"aria-label":e},m("header",{},m("h2",{text:e}),m("button.itp-btn.icon",{type:"button","aria-label":"Close",html:ie("x"),onclick:()=>r.close()})),i,n.length?m("footer",{},...n.map(a=>m(`button.itp-btn${a.primary?".primary":".outline"}`,{type:"button",text:a.label,onclick:async()=>{await a.onClick?.()!==!1&&r.close()}}))):null);return r.addEventListener("close",()=>{r.remove(),o?.()}),document.body.append(r),r.showModal(),r.body=i,r.setContent=(...a)=>At(i,...a),r}var Gt=e=>(e||"image").replace(/\.[^.]+$/,"").replace(/[^\w.-]+/g,"-").replace(/^-+|-+$/g,"")||"image",Zn=e=>({scale:e.export.scale,grid:e.export.grid,gridColor:e.export.gridColor,indexed:e.export.indexed});function Jn(e,t,n){return e.export.size==="source"&&t&&n&&t.crop?{width:Math.max(1,Math.round(t.crop.w*n.width)),height:Math.max(1,Math.round(t.crop.h*n.height))}:{width:t?t.width*e.export.scale:0,height:t?t.height*e.export.scale:0}}var jo=(e,t,n)=>e.export.size==="source"&&n?{...Jn(e,t,n),indexed:e.export.indexed}:Zn(e);function wc(e,t,n=4){let o=Math.max(1,Math.ceil(240/Math.min(t.width,t.height))),i=c=>{let l=Math.round(c*16/9),s=t.height>t.width,d=s?c:l,h=s?l:c;return Math.max(o,Math.min(Math.floor(d/t.width),Math.floor(h/t.height)))},r=e==="scale"?Math.max(o,n):i(Number(e)||1080);return[r,i(1080),i(720),o].filter((c,l,s)=>c<=r&&s.indexOf(c)===l).sort((c,l)=>l-c)}function vc(e,t){if(!t?.active)return e;if(!t.complete)throw new Error("Wait for the selected interval to finish loading");if(!t.renderedFrames.length)throw new Error("Select frames on the canvas first");return{...e,source:"video",item:t.item,settings:t.settings,fps:t.fps,start:t.start,end:t.end,audio:!1,renderedFrames:t.renderedFrames.map(n=>({...n}))}}function Hi(e){let t=()=>e.store.settings,n=()=>e.frameSelection?.()?.active?(Q("Turn off frame selection to export the current frame",{kind:"error"}),!0):!1,o=p=>{try{return vc(p,e.frameSelection?.())}catch(b){return Q(b.message,{kind:"error"}),null}};async function i(){if(n())return;if(!e.result)return Q("Open an image first",{kind:"error"});let p=t(),b=await Pt(e.result,jo(p,e.result,e.current)),M=Jn(p,e.result,e.current),v=p.export.size==="source"?`-${M.width}x${M.height}`:p.export.scale>1?`@${p.export.scale}x`:"";vt(b,`${Gt(e.current.name)}-${e.result.width}x${e.result.height}${v}.png`,"image/png"),Q(`Saved ${M.width} \xD7 ${M.height} PNG`,{kind:"ok"})}async function r(){if(!n()&&e.result)try{let p=await Pt(e.result,{...jo(t(),e.result,e.current),indexed:!1});await navigator.clipboard.write([new ClipboardItem({"image/png":new Blob([p],{type:"image/png"})})]),Q("Image copied",{kind:"ok"})}catch(p){Q(`Couldn't copy: ${p.message}`,{kind:"error"})}}async function a(p,b){if(e.exporting)return Q("An export is already running");let M=new AbortController,v=Q(p,{progress:!0,onCancel:()=>M.abort()});e.exporting=!0;try{let k=await b(M.signal,(x,w)=>{v.progress(x),w&&v.update(w)});v.done(k)}catch(k){v.close(),k.name!=="AbortError"?(Q(`Export failed: ${k.message}`,{kind:"error"}),console.error(k)):Q("Export cancelled")}finally{e.exporting=!1,e.schedule()}}async function c(){let p=e.items.slice();p.length&&await a(`Processing ${p.length} files`,async(b,M)=>{let v=[],k=[];for(let x=0;x<p.length;x++){if(b.aborted)throw new DOMException("Aborted","AbortError");let w=p[x],y=e.settingsFor(w);w.type==="video"&&e.engine.invalidate();let A=await e.engine.process(w.source,y);v.push({name:`${Gt(w.name)}.png`,data:await Pt(A,jo(y,A,w))}),w.own&&k.push({name:`${Gt(w.name)}.settings.json`,data:an(y)}),M((x+1)/p.length,`Processed ${x+1} of ${p.length}`)}return v.push({name:"settings.json",data:an(e.shared)},...k),vt(wn(v),"pixel-art.zip","application/zip"),`Saved ${p.length} images as a ZIP`})}async function l(p,b,M,v){let k=t(),x=e.current;if(!x||x.type!=="video")throw new Error("Open a video first");let w=x.source,y=p.end>p.start?p.end:w.duration;return ln(w,{fps:p.fps,start:p.start,end:y,signal:b,onFrame:async({index:A,total:_})=>{e.engine.invalidate();let P=await e.engine.process(w,k);await v(P,A,_,`${Gt(x.name)}-${String(A).padStart(4,"0")}`),M((A+1)/_,`Frame ${A+1} of ${_}`)}})}async function s(p,b,M,v){if(p.renderedFrames){for(let k=0;k<p.renderedFrames.length;k++){if(b.aborted)throw new DOMException("Aborted","AbortError");let{result:x,index:w}=p.renderedFrames[k];await v(x,k,p.renderedFrames.length,`${Gt(p.item.name)}-${String(w).padStart(4,"0")}`),M((k+1)/p.renderedFrames.length,`Frame ${k+1} of ${p.renderedFrames.length}`)}return p.renderedFrames.length}if(p.source==="files"){let k=e.items.filter(w=>w.type==="image"),x=null;for(let w=0;w<k.length;w++){if(b.aborted)throw new DOMException("Aborted","AbortError");let y=e.settingsFor(k[w]),A=await e.engine.process(k[w].source,x?Ht(y,{size:x}):y);x||(x={mode:"width",width:A.width,height:A.height}),await v(A,w,k.length,k[w].name),M((w+1)/k.length,`Frame ${w+1} of ${k.length}`)}return k.length}return l(p,b,M,v)}async function d(p){if(p=o(p),!p)return;let b=p.source==="files"?"animation":Gt((p.item||e.current)?.name),M=p.settings||t(),v=1e3/p.fps;if(p.format==="gif"||p.format==="png-seq"){await a("Rendering frames",async(k,x)=>{let w=[];if(await s(p,k,x,async(y,A,_,P)=>{p.format==="gif"?w.push({width:y.width,height:y.height,data:y.data,delay:v}):w.push({name:`${P}.png`,data:await Pt(y,Zn(M))})}),p.format==="gif"){x(1,"Encoding GIF"),await new Promise(A=>setTimeout(A,0));let y=Ti(w,{scale:M.export.scale,loop:0});return vt(y,`${b}.gif`,"image/gif"),`Saved GIF (${w.length} frames, ${(y.length/1024).toFixed(0)} KB)`}return vt(wn(w),`${b}-frames.zip`,"application/zip"),`Saved ${w.length} PNG frames`});return}await a(`Encoding ${p.format.toUpperCase()}`,async(k,x)=>{let{createVideoEncoder:w,decodeAudio:y}=await Promise.resolve().then(()=>(Ho(),Go)),A=e.current,_=null;if(p.audio&&p.source==="video"&&A&&A.type==="video"&&A.file){x(0,"Reading audio");let T=p.end>p.start?p.end:A.source.duration;_=await y(A.file,{start:p.start,end:T}).catch(O=>(console.warn("[export] audio",O),null))}let P=null;await s(p,k,x,async T=>{if(!P){let O=wc(p.videoSize,T,M.export.scale),D=null;for(let F of O)try{P=await w({format:p.format,fps:p.fps,width:T.width,height:T.height,scale:F,audio:_});break}catch(G){if(D=G,!/encoder available/.test(G.message))throw G}if(!P)throw D}await P.add(T)}),_&&P.audioCodec&&x(1,"Encoding audio");let I=await P.finish();vt(I,`${b}.${p.format}`);let H=!p.audio||p.source!=="video"?"":P.audioCodec==="opus"&&p.format==="mp4"?", with Opus audio: VLC and browsers play it, Windows Media Player and QuickTime may not":P.audioCodec?", with audio":_?", without audio (this browser can't encode it)":", no audio track in the source";return`Saved ${p.format.toUpperCase()} (${(I.size/1024/1024).toFixed(1)} MB${H})`})}async function h(p){if(p=o(p),!p)return;let b=p.source==="files"?"sheet":`${Gt((p.item||e.current)?.name)}-sheet`,M=p.settings||t();await a("Building sprite sheet",async(v,k)=>{let x=[];await s(p,v,k,(_,P,I,H)=>{x.push({width:_.width,height:_.height,data:_.data,name:H?Gt(H):void 0,delay:1e3/p.fps})});let{image:w,atlas:y}=Ro(x,{columns:p.columns,padding:p.padding,name:b});if(M.export.scale>1){let _=M.export.scale;for(let P of Object.values(y.frames)){for(let I of["x","y","w","h"])P.frame[I]*=_;P.sourceSize.w*=_,P.sourceSize.h*=_}y.meta.size.w*=_,y.meta.size.h*=_,y.meta.scale=String(_)}let A=await Pt(w,Zn(M));return vt(wn([{name:`${b}.png`,data:A},{name:`${b}.json`,data:JSON.stringify(y,null,2)}]),`${b}.zip`,"application/zip"),`Saved a ${x.length}-frame sprite sheet`})}async function f({tile:p,flips:b}){if(n())return;if(!e.result)return Q("Open an image first",{kind:"error"});let M=t(),v=_i(e.result,{tileWidth:p,tileHeight:p,flips:b}),k=`${Gt(e.current.name)}-tiles`,x=await Pt(v.image,Zn(M)),w={...v.map,image:`${k}.png`,note:"tiles[] holds one tile index per cell, row by row"+(b?"; flips[] is 0 none, 1 horizontal, 2 vertical, 3 both":"")};vt(wn([{name:`${k}.png`,data:x},{name:`${k}.json`,data:JSON.stringify(w,null,2)}]),`${k}.zip`,"application/zip"),Q(`Saved ${v.count} unique tiles (${v.map.width} \xD7 ${v.map.height} map)`,{kind:"ok"})}return{exportPNG:i,copyImage:r,exportZip:c,exportAnimation:d,exportSheet:h,exportTileset:f}}un();var on=(e,t,n)=>Math.max(t,Math.min(n,e)),Sn=e=>`${e.toFixed(3)}s`,eo=140,to=124,no=10,Xo=3,Cn=1e3,Ec=.05,Vi=7,ji=11;function kc(e,t,n=!1){let o=Math.max(1,Math.min(Math.max(1,t),Math.round(e/2))),i=Math.max(1,Math.ceil(t/o)),r=o*eo+(o-1)*no,a=i*to+(i-1)*no,c=n?{x:r+24,y:0,w:eo,h:to+24}:null;return{cols:o,width:c?c.x+c.w:r,height:Math.max(a,c?.h||0),animation:c}}function Xi(e,t,n=0,o=e){let i=Math.max(1,Math.ceil(e*t-1e-6)),r=on(Math.round(n*t),0,i-1),a=on(o>=e?i:Math.round(o*t),r+1,i);return{count:i,first:r,last:a}}function Wo(e,t){let n=Math.round(t*10)/10;return e>=t-Ec||Math.abs(e-n)<1e-6}function Vo({first:e,last:t},n=!1){return t-e<=Cn?{first:e,last:t}:n?{first:t-Cn,last:t}:{first:e,last:e+Cn}}function Qn(e,t,n){let o=Math.min(Vi,t.width/2),i=Math.max(0,t.width-o*2);return t.left+o+e/Math.max(1,n)*i}function Mc(e,t,n){let o=Math.min(Vi,t.width/2),i=Math.max(1,t.width-o*2);return Math.round(on((e-t.left-o)/i,0,1)*n)}function Sc(e,t,{start:n=0,end:o=0,rangeTouched:i=!1}={}){let a=i||n>1e-6||o>n&&!Wo(o,e)?o||e:Math.min(e,n+Xo),c=Xi(e,t,n,a),l=Vo(c);return l.last===c.last?c:{...c,last:l.last,capped:!0}}function Wi(e,{onModeChange:t,onZoomChange:n,onRangeChange:o,onSelectionChange:i,animationOptions:r}){let a=null,c=!1,l=!1,s=!1,d=30,h=12,f=1,p=0,b=1,M=1,v=[],k=new Set,x="",w=0,y=null,A=null,_=!1,P=!1,I=0,H=!1,T=null,O=null,D=0,F=[],G=(L,$,Y="",oe={})=>m(`button.itp-btn.small${Y}`,{type:"button",text:L,onclick:$,...oe}),N=m("span.itp-story-status",{role:"status",text:"Choose a time interval below"}),ve=m("span.num",{text:"0 selected"}),ke=G("Select all",()=>{v.forEach(L=>k.add(L.index)),$e()}),fe=G("Clear",()=>{k.clear(),$e()}),se=m("span.num",{text:"Fit"}),de=G("",()=>dt(-1),".icon",{html:ie("zoomOut"),"aria-label":"Smaller frame tiles"}),ze=G("",()=>dt(1),".icon",{html:ie("zoomIn"),"aria-label":"Larger frame tiles"}),me=G("",je,".icon.outline",{html:ie("play"),"aria-label":"Play selected",title:"Play selected (Space)","aria-pressed":"false"}),W=m("div.itp-story-grid",{role:"group","aria-label":"Video frames. Drag to pan, use the wheel to zoom, and click a frame to select it."}),V=m("canvas.itp-story-canvas",{tabindex:"0","aria-label":"Video frames and selected animation. Drag to pan, scroll to zoom."}),Ce=m("div.itp-story-overlay",{},m("div.itp-float.itp-story-head",{},N,ve),m("div.itp-float.itp-story-actions",{},ke,fe,m("div.itp-story-zoom",{role:"group","aria-label":"Frame tile size"},de,se,ze),me));W.append(V,Ce);let xe=m("section.itp-storyboard",{"aria-label":"Select video frames",hidden:!0},W),z={x:0,y:0,z:1,fitted:!0,vw:0,vh:0,dpr:1},ge=m("input",{type:"range",min:0,max:1,step:1,value:0,"aria-label":"Interval start frame"}),be=m("input",{type:"range",min:0,max:1,step:1,value:1,"aria-label":"Interval end frame"}),pe=m("div.itp-story-range",{},m("div.itp-story-range-track"),ge,be),Se=m("input.itp-input.num",{type:"number",min:0,step:"0.001",value:0,"aria-label":"Interval start seconds"}),Ie=m("input.itp-input.num",{type:"number",min:0,step:"0.001",value:0,"aria-label":"Interval end seconds"}),Re=m("span.muted.num"),Ze=m("div.itp-transport.itp-transport-tiled",{hidden:!0,role:"group","aria-label":"Video time interval"},m("label.itp-story-time",{},"In",Se),pe,m("label.itp-story-time",{},"Out",Ie),Re);ge.addEventListener("input",()=>Ye(Number(ge.value),b,"start")),be.addEventListener("input",()=>Ye(p,Number(be.value),"end")),Se.addEventListener("change",()=>Ye(Math.round(Number(Se.value)*d),b,"start")),Ie.addEventListener("change",()=>Ye(p,Math.round(Number(Ie.value)*d),"end"));let ce=null,Je=null;pe.addEventListener("pointerdown",L=>{if(!l||_||L.button!==0)return;let $=pe.getBoundingClientRect(),Y=Math.abs(L.clientX-Qn(p,$,f)),oe=Math.abs(L.clientX-Qn(b,$,f)),he=Y<=oe;(he?Y:oe)>ji||(ce=he?"start":"end",(he?ge:be).focus({preventScroll:!0}),_=!0,Je=L.pointerId,pe.setPointerCapture(L.pointerId),L.preventDefault(),P&&clearTimeout(A))}),pe.addEventListener("pointermove",L=>{if(_&&L.pointerId!==Je)return;let $=pe.getBoundingClientRect();if(!_){let oe=Math.min(Math.abs(L.clientX-Qn(p,$,f)),Math.abs(L.clientX-Qn(b,$,f)));pe.style.cursor=oe<=ji?"ew-resize":"";return}let Y=Mc(L.clientX,$,f);ce==="start"?Ye(Y,b,"start"):Ye(p,Y,"end")}),pe.addEventListener("pointerleave",()=>{_||(pe.style.cursor="")});let nt=L=>{!_||L.pointerId!==Je||(_=!1,ce=null,Je=null,P&&He())};window.addEventListener("pointerup",nt),window.addEventListener("pointercancel",nt);function Oe(L=!1){ge.max=be.max=String(f),ge.value=String(p),be.value=String(b),ge.setAttribute("aria-valuetext",Sn(p/d)),be.setAttribute("aria-valuetext",Sn(Math.min(a.duration,b/d))),Se.max=Ie.max=String(a.duration),Se.value=(p/d).toFixed(3),Ie.value=Math.min(a.duration,b/d).toFixed(3),pe.style.setProperty("--from",`${p/f*100}%`),pe.style.setProperty("--to",`${b/f*100}%`),ge.style.zIndex=p>f/2?"3":"2",Re.textContent=`${d} fps`,o?.({start:p/d,end:Math.min(a.duration,b/d),user:L})}function Ye(L,$,Y){if(!l||!Number.isFinite(L)||!Number.isFinite($)){a&&Oe();return}let oe=on(L,0,Y==="start"?b-1:f-1),he=on($,Y==="end"?p+1:oe+1,f),ae=Vo({first:oe,last:he},Y==="end");(ae.first!==oe||ae.last!==he)&&bt(),ot(ae.first,ae.last,!0)}function ot(L,$,Y=!1){if(L===p&&$===b){Oe(Y);return}p=L,b=$,k=new Set([...k].filter(oe=>oe>=p&&oe<b)),Oe(Y),He()}function St(L,$){if(!c||!l)return;let Y=Xi(a.duration,d,L,$>L?$:a.duration),oe=Vo(Y);(oe.first!==Y.first||oe.last!==Y.last)&&bt(),ot(oe.first,oe.last)}function rt(){return kc(d,I,!!O)}function Ue(){let L=W.getBoundingClientRect(),$=Math.min(3,window.devicePixelRatio||1);z.vw=L.width,z.vh=L.height,z.dpr=$,V.width=Math.max(1,Math.round(L.width*$)),V.height=Math.max(1,Math.round(L.height*$)),z.fitted?We():Be()}function We(L=!0){let $=rt();if(!v.length){z.x=z.vw/2,z.y=z.vh/2,Be();return}let Y=Et();z.z=Math.max(.05,Math.min(128,(z.vw-24)/$.width,(Y-24)/$.height)),z.x=(z.vw-$.width*z.z)/2,z.y=(Y-$.height*z.z)/2,z.fitted=!0,ut(),Be(),L&&n?.()}function qe(){let L=rt().animation;if(!L)return;let $=Et();z.x=z.vw/2-(L.x+L.w/2)*z.z,z.y=$/2-(L.y+L.h/2)*z.z,z.fitted=!1,ut(),Be(),n?.(),V.focus({preventScroll:!0})}function Et(){return Math.max(1,z.vh-Ce.offsetHeight-24)}function mt(L){let $=rt(),Y=L%$.cols,oe=Math.floor(L/$.cols);return{x:Y*(eo+no),y:oe*(to+no),w:eo,h:to}}function Be(){let L=V.getContext("2d"),{dpr:$,vw:Y,vh:oe,x:he,y:ae,z:Le}=z,C=getComputedStyle(xe),U=C.getPropertyValue("--stage").trim()||"#1b1c20",B=C.getPropertyValue("--panel").trim()||"#25262b",K=C.getPropertyValue("--raised").trim()||"#303137",re=C.getPropertyValue("--muted").trim()||"#a1a3ad",j=C.getPropertyValue("--accent").trim()||"#ffbd4a",te=C.getPropertyValue("--accent-soft").trim()||"#40351e",le=C.getPropertyValue("--line").trim()||"#45464d";L.setTransform(1,0,0,1,0,0),L.clearRect(0,0,V.width,V.height),L.setTransform($,0,0,$,0,0),L.fillStyle=U,L.fillRect(0,0,Y,oe),L.imageSmoothingEnabled=!1;let Ae=C.getPropertyValue("--font-ui").trim()||"sans-serif";function ye(we,Te,E=!1){let X=he+Te.x*Le,ue=ae+Te.y*Le,Me=Te.w*Le,J=Te.h*Le;if(X>Y||ue>oe||X+Me<0||ue+J<0)return;let u=E||k.has(we.index);L.fillStyle=u?te:B,L.fillRect(X,ue,Me,J);let g=6*Le,S=18*Le,R=E?24*Le:0,q=Math.min((Me-g*2)/we.canvas.width,(J-R-S-g*2)/we.canvas.height),Z=we.canvas.width*q,ne=we.canvas.height*q;L.fillStyle=K,L.fillRect(X+g,ue+R+g,Me-g*2,J-R-S-g*2),L.drawImage(we.canvas,X+(Me-Z)/2,ue+R+g+(J-R-S-g*2-ne)/2,Z,ne),L.save(),L.beginPath(),L.rect(X+g,ue,Me-g*2,J),L.clip(),L.font=`${11*Le}px ${Ae}`,L.fillStyle=re,E?(L.fillStyle=j,L.fillText("Selected animation",X+g,ue+17*Le),L.fillStyle=re,L.fillText(`${D+1} of ${F.length} / ${h} fps`,X+g,ue+J-6*Le)):L.fillText(`#${we.index} / ${Sn(we.time)}`,X+g,ue+J-6*Le),L.restore(),L.strokeStyle=u?j:le,L.lineWidth=Math.max(1,Le),L.strokeRect(X+.5,ue+.5,Me-1,J-1)}v.forEach((we,Te)=>ye(we,mt(Te))),O&&ye(O,rt().animation,!0)}function gt(L,$){if(!s)return;let Y=W.getBoundingClientRect(),oe=(L-Y.left-z.x)/z.z,he=($-Y.top-z.y)/z.z,ae=v.find((Le,C)=>{let U=mt(C);return oe>=U.x&&oe<=U.x+U.w&&he>=U.y&&he<=U.y+U.h});ae&&(k.has(ae.index)?k.delete(ae.index):k.add(ae.index),$e())}let Fe=null,Ge=new Map;V.addEventListener("pointerdown",L=>{if(V.focus({preventScroll:!0}),V.setPointerCapture(L.pointerId),Ge.set(L.pointerId,{x:L.clientX,y:L.clientY}),Ge.size===2){Fe=null;return}Fe={pointerId:L.pointerId,x:L.clientX,y:L.clientY,ox:z.x,oy:z.y,moved:!1}}),V.addEventListener("pointermove",L=>{if(!Ge.has(L.pointerId))return;let $=Ge.get(L.pointerId);if(Ge.set(L.pointerId,{x:L.clientX,y:L.clientY}),Ge.size===2){let[he,ae]=[...Ge.values()],Le=[...Ge.entries()].find(([C])=>C!==L.pointerId)?.[1];if(Le){let C=Math.hypot($.x-Le.x,$.y-Le.y),U=Math.hypot(he.x-ae.x,he.y-ae.y),B=W.getBoundingClientRect();C>0&&Ke(z.z*U/C,(he.x+ae.x)/2-B.left,(he.y+ae.y)/2-B.top)}Fe=null;return}if(!Fe||Fe.pointerId!==L.pointerId)return;let Y=L.clientX-Fe.x,oe=L.clientY-Fe.y;Math.abs(Y)+Math.abs(oe)>3&&(Fe.moved=!0),z.x=Fe.ox+Y,z.y=Fe.oy+oe,z.fitted=!1,Be()}),V.addEventListener("pointerup",L=>{if(Ge.delete(L.pointerId),!Fe||Fe.pointerId!==L.pointerId)return;let $=!Fe.moved,{x:Y,y:oe}=L;Fe=null,$&&gt(Y,oe),ut(),n?.()}),V.addEventListener("pointercancel",L=>{Ge.delete(L.pointerId),Fe=null}),V.addEventListener("wheel",L=>{L.preventDefault();let $=W.getBoundingClientRect(),Y=L.clientX-$.left,oe=L.clientY-$.top;if(!L.ctrlKey&&L.deltaMode===0&&Math.abs(L.deltaX)>Math.abs(L.deltaY)){z.x-=L.deltaX,z.y-=L.deltaY,z.fitted=!1,Be(),ut(),n?.();return}L.ctrlKey&&L.deltaMode===0?Ke(z.z*Math.exp(-L.deltaY*.01),Y,oe):dt(L.deltaY<0?1:-1,Y,oe)},{passive:!1}),V.addEventListener("dblclick",()=>We()),new ResizeObserver(Ue).observe(W),new ResizeObserver(()=>{c&&z.fitted&&We()}).observe(Ce);let st=0;function bt(){let L=performance.now();L-st<2e3||(st=L,e.toast(`This interval is longer than ${Cn} frames, so only ${Cn} are loaded. Narrow the range to reach the rest.`))}function kt(){w++,clearTimeout(A),y?.abort(),y=null,P=!1,W.setAttribute("aria-busy","false")}function yt(){let{export:L,...$}=e.store.settings;return JSON.stringify($)}function He(){if(kt(),Qe(!0),s=!1,De(),!c||!l)return;P=!0,N.textContent=`Waiting to load ${b-p} frames...`,W.setAttribute("aria-busy","true");let L=w;_||(A=setTimeout(()=>It(L),300))}async function It(L){let $=a,Y=p,oe=b,he=d;P=!1,I=oe-Y,v=[],Be(),De(),N.textContent=`Loading ${oe-Y} frames...`;let ae=e.store.settings;x=yt();let Le=new AbortController;y=Le;let C=()=>L===w&&c&&a===$&&!Le.signal.aborted,U=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});U.muted=!0,U.src=$.source.currentSrc||$.source.src;try{let B=Array.from({length:oe-Y},(K,re)=>Math.min((Y+re+.5)/he,$.duration-1e-4));if(await ln(U,{fps:he,times:B,signal:Le.signal,onFrame:async({index:K,time:re,total:j})=>{if(!C())return;let te=await e.engine.process(U,ae);if(!C())return;let le=Y+K,Ae=te.toCanvas(1);v.push({index:le,time:re,result:te,canvas:Ae}),z.fitted&&v.length===1?We():Be(),N.textContent=`Loading ${K+1} / ${j} frames`,De()}}),!C())return;s=!0,z.fitted&&We(),N.textContent=`${v.length} frames / ${Sn(Y/he)} - ${Sn(Math.min($.duration,oe/he))}`}catch(B){C()&&B.name!=="AbortError"&&(N.textContent=`Could not load frames: ${B.message}`,e.toast(N.textContent,{kind:"error"}))}finally{U.pause(),U.removeAttribute("src"),U.load(),C()&&(y=null,W.setAttribute("aria-busy","false"),De())}}function De(){let L=v.filter($=>k.has($.index)).length;ve.textContent=`${L} selected`,ke.disabled=!s||!v.length,fe.disabled=!k.size,me.disabled=!s||!L,i?.({active:c,complete:s,count:L,result:v[0]?.result||null})}function $e(){if(De(),O){let L=H;if(Qe(),F=v.filter($=>k.has($.index)),!F.length){Qe(!0);return}if(D=Math.max(0,F.findIndex($=>$.index===O.index)),O=F[D],L){ct(!1);return}}Be()}function ct(L=!0){let $=v.filter(ae=>k.has(ae.index));if(!c||!s||!$.length)return;cancelAnimationFrame(T),F=$,D=Math.max(0,$.findIndex(ae=>ae.index===O?.index)),H=!0,O=$[D],L&&qe(),lt();let Y=h,oe=performance.now()-D*1e3/Y,he=()=>{let ae=Math.floor((performance.now()-oe)*Y/1e3)%$.length;D!==ae&&(O=$[ae],D=ae,Be()),T=requestAnimationFrame(he)};Be(),he()}function Qe(L=!1){let $=!!O;if(cancelAnimationFrame(T),T=null,H=!1,L&&(O=null,F=[],D=0),lt(),L&&$){z.fitted=!0,We();return}Be()}function je(){H?Qe():ct()}function lt(){let L=H?"Pause selected":"Play selected";me.innerHTML=ie(H?"pause":"play"),me.setAttribute("aria-label",L),me.title=`${L} (Space)`,me.setAttribute("aria-pressed",String(H))}function Ve(L){let $=on(Number(L)||12,1,60);$!==h&&(h=$,H?ct(!1):Be())}function Ne(){return c?{active:c,complete:s,item:a,settings:e.store.settings,fps:h,start:p/d,end:Math.min(a.duration,b/d),renderedFrames:v.filter(L=>k.has(L.index)).map(L=>({result:L.result,index:L.index}))}:null}async function it(){let L=a;if(N.textContent="Detecting video frame rate...",ge.disabled=be.disabled=Se.disabled=Ie.disabled=!0,L.fpsReady&&await L.fpsReady,a!==L||!c)return;L.source.pause(),d=L.fps||30;let $=r(),Y=Sc(L.duration,d,$);({count:f,first:p,last:b}=Y),Y.capped&&bt(),Ve($.fps),l=!0,ge.disabled=be.disabled=Se.disabled=Ie.disabled=!1,Oe(),He()}function xt(L){if(!(!a||a.type!=="video"||L===c)){if(c=L,xe.hidden=Ze.hidden=!c,c)if(Ue(),a.fpsReady||a.source.pause(),!l)it();else{let $=r();St($.start,$.end||a.duration),Ve($.fps),(!s||x!==yt())&&He()}else _=!1,ce=null,Je=null,kt(),Qe(!0);De(),t(c)}}function Ct(L){L!==a&&(c&&xt(!1),kt(),Qe(!0),a=L,v=[],I=0,k.clear(),Be(),l=s=!1,x="",De())}function Lt(){c&&l&&x!==yt()&&He()}function ut(){M=z.z,se.textContent=z.fitted?"Fit":M>=1?`${Math.round(M*10)/10}\xD7`:`${Math.round(M*100)}%`,de.disabled=M<=.05,ze.disabled=M>=128}function Ke(L,$,Y){let oe=on(L,.05,128);$??($=z.vw/2),Y??(Y=z.vh/2);let he=($-z.x)/z.z,ae=(Y-z.y)/z.z;z.z=oe,z.x=$-he*oe,z.y=Y-ae*oe,z.fitted=!1,Be(),ut(),n?.()}function dt(L,$,Y){let oe=L>0?xn.find(he=>he>M+1e-6)||M*1.5:[...xn].reverse().find(he=>he<M-1e-6)||M/1.5;Ke(oe,$,Y)}return De(),{el:xe,transport:Ze,range:pe,get active(){return c},get zoom(){return M},get fitted(){return z.fitted},frameCanvas:L=>v.find($=>$.index===L)?.canvas,currentResult:()=>v[0]?.result||null,setItem:Ct,setMode:xt,setRange:St,setPlaybackFps:Ve,exportSelection:Ne,refresh:Lt,toggleAnimation:je,zoomTo:Ke,zoomStep:dt,fit:We}}var qi="itp:";function Rt(e,t){try{let n=localStorage.getItem(qi+e);return n==null?t:JSON.parse(n)}catch{return t}}function _t(e,t){try{return localStorage.setItem(qi+e,JSON.stringify(t)),!0}catch{return!1}}function Ki(e){let{store:t}=e,n=(E,X)=>t.update(E,{key:X}),o=()=>t.commit(),i=()=>t.settings,r=Dt(),a=(E,X)=>JSON.stringify(E)===JSON.stringify(X),c=Rt("sections",{}),l=(E,X,ue,Me,...J)=>Mi(X,{open:c[E]??ue,onToggle:u=>{c[E]=u,_t("sections",c)},onReset:Me?()=>{let u={};for(let g of Me)u[g]=JSON.parse(JSON.stringify(r[g]));t.update(u)}:null},...J),s=m("div.v",{text:"\u2013"}),d=m("div.v",{text:"\u2013"}),h=m("div.v",{text:"\u2013"}),f=m("div.itp-stats",{"aria-live":"polite"},m("div.itp-stat",{},m("div.k",{text:"Output"}),s),m("div.itp-stat",{},m("div.k",{text:"Colours"}),d),m("div.itp-stat",{},m("div.k",{text:"Render"}),h)),p=m("button",{type:"button",role:"tab","aria-selected":"true",id:"itp-tab-setup","aria-controls":"itp-pane-setup",html:`${ie("sliders")}<span>Setup</span>`}),b=m("button",{type:"button",role:"tab","aria-selected":"false",id:"itp-tab-export","aria-controls":"itp-pane-export",html:`${ie("download")}<span>Export</span>`}),M=m("div.itp-seg",{role:"tablist","aria-label":"Inspector"},p,b),v=en({label:"Settings apply to",bare:!0,options:[{value:"shared",label:"All files",icon:"layers"},{value:"own",label:"This file",icon:"unlink"}],value:"shared",onChange:E=>e.current&&e.setOwn(e.current,E==="own")}),k=m("span.itp-scope-note",{}),x=m("div.itp-scope",{hidden:!0},m("div.lab",{},m("span",{text:"Settings apply to"}),k),v.el),w=en({label:"Size by",options:[{value:"width",label:"Width"},{value:"block",label:"Pixel size"}],value:"width",onChange:E=>n({size:{mode:E}})}),y=ht({label:"Pixel width",min:8,max:512,step:1,value:96,reset:96,onInput:E=>n({size:{width:E}},"width"),onCommit:o}),A=tn({label:"Height",min:0,max:2048,help:"Leave empty to keep the aspect ratio.",onChange:E=>n({size:{height:E}})});A.input.placeholder="Auto";let _=ht({label:"Pixel size",min:1,max:64,step:1,value:8,reset:8,help:"How many source pixels become one output pixel.",onInput:E=>n({size:{block:E}},"block"),onCommit:o}),P=en({label:"Resample",options:[{value:"box",label:"Average"},{value:"nearest",label:"Nearest"}],value:"box",help:"Nearest keeps hard edges; use it for art that is already pixelated.",onChange:E=>n({size:{resample:E}})}),I=m("button.itp-btn.small.outline",{type:"button",html:`${ie("grid")}<span>Detect grid</span>`,title:"Find the pixel size of upscaled pixel art",onclick:()=>e.detectGrid()}),H=m("div",{style:{display:"contents"}},y.el,A.el),T=m("div",{style:{display:"contents"}},_.el),O=l("size","Size",!0,["size"],w.el,H,T,P.el,m("div.itp-row",{},I)),D=rn.map(E=>{let X=E.ratio||1.3333333333333333,ue=m("i",{style:{width:`${Math.round(X>=1?16:16*X)}px`,height:`${Math.round(X>=1?16/X:16)}px`}});return E.ratio||ue.classList.add("orig"),m("button",{type:"button","aria-pressed":"false",title:E.id==="original"?"The source's own shape":`Crop to ${E.label}`,onclick:()=>n({frame:{aspect:E.id}})},ue,m("span",{text:E.label}))}),F=m("div.itp-aspects",{role:"group","aria-label":"Aspect ratio"},...D),G=ht({label:"Zoom",min:1,max:8,step:.05,value:1,reset:1,help:"Crop into the middle of the frame.",onInput:E=>n({frame:{zoom:E}},"fz"),onCommit:o}),N=ht({label:"Horizontal position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:E=>n({frame:{x:E}},"fx"),onCommit:o}),ve=ht({label:"Vertical position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:E=>n({frame:{y:E}},"fy"),onCommit:o}),ke=l("frame","Frame",!1,["frame"],Bt("Aspect ratio",F),G.el,N.el,ve.el),fe=Xt({label:"Source",options:[{value:"builtin",label:"Built-in palette"},{value:"custom",label:"Custom colours"},{value:"extract",label:"From the image"},{value:"none",label:"None (keep colours)"}],onChange:E=>n({palette:{source:E}})}),se=Xt({label:"Palette",options:pn.map(E=>({value:E.id,label:`${E.name} (${E.colors.length})`})),onChange:E=>n({palette:{source:"builtin",id:E}})}),de=ht({label:"Number of colours",min:2,max:64,step:1,value:16,reset:16,onInput:E=>n({palette:{count:E}},"count"),onCommit:o}),ze=m("div.itp-swatches",{role:"list","aria-label":"Palette colours"}),me=m("span.val.num",{}),W=Bt("Colours",ze,{value:me}),V=en({label:"Colour matching",options:[{value:"oklab",label:"Perceptual"},{value:"rgb",label:"RGB"}],value:"oklab",onChange:E=>n({palette:{distance:E}})}),Ce=m("div.itp-row",{style:{flexWrap:"wrap"}},m("button.itp-btn.small.outline",{type:"button",html:`${ie("upload")}<span>Import</span>`,title:".gpl, .hex, .pal, .txt or .json",onclick:()=>e.importPalette()}),m("button.itp-btn.small.outline",{type:"button",html:`${ie("palette")}<span>Lospec</span>`,onclick:()=>e.lospecDialog()}),m("button.itp-btn.small.outline",{type:"button",html:`${ie("pipette")}<span>Pick</span>`,title:"Add colours by clicking the image","aria-pressed":"false",onclick:E=>e.togglePicker(E.currentTarget)}),m("button.itp-btn.small",{type:"button",html:`${ie("download")}<span>Save</span>`,title:"Save to Your palettes",onclick:()=>e.savePalette()})),xe=l("palette","Palette",!1,["palette"],fe.el,se.el,de.el,W,V.el,Ce),z={none:"None",ordered:"Ordered",diffusion:"Error diffusion"},ge=Xt({label:"Method",options:mn.map(E=>({value:E.id,label:E.label,group:z[E.kind]})),onChange:E=>n({dither:{method:E}})}),be=ht({label:"Strength",min:0,max:1,step:.01,scale:100,value:.6,reset:.6,onInput:E=>n({dither:{strength:E}},"strength"),onCommit:o}),pe=m("textarea.itp-input",{rows:4,spellcheck:!1,"aria-label":"Custom threshold matrix",placeholder:`0 8 2 10
302
302
  12 4 14 6
303
303
  3 11 1 9
304
- 15 7 13 5`}),xe=m("div.help",{text:"Rows of numbers, up to 16\xD716. Only their order matters."});ge.addEventListener("change",()=>{try{n({dither:{method:"custom",matrix:Wo(ge.value)}}),xe.textContent="Rows of numbers, up to 16\xD716. Only their order matters.",xe.style.color=""}catch(w){xe.textContent=w.message,xe.style.color="var(--danger)"}});let ke=m("div.itp-field",{},m("div.lab",{},m("span",{text:"Matrix"})),ge,xe),ie=u("dither","Dither",!1,["dither"],me.el,pe.el,ke),ze={min:-1,max:1,step:.01,scale:100,value:0,reset:0},Be=Oe({label:"Brightness",...ze,onInput:w=>n({adjust:{brightness:w}},"br"),onCommit:o}),lt=Oe({label:"Contrast",...ze,onInput:w=>n({adjust:{contrast:w}},"co"),onCommit:o}),qe=Oe({label:"Saturation",...ze,onInput:w=>n({adjust:{saturation:w}},"sa"),onCommit:o}),Ne=Oe({label:"Hue",min:-180,max:180,step:1,value:0,reset:0,help:"Rotates every colour around the colour wheel; greys stay grey.",onInput:w=>n({adjust:{hue:w}},"hu"),onCommit:o}),Ct=Oe({label:"Gamma",min:.2,max:3,step:.05,value:1,reset:1,onInput:w=>n({adjust:{gamma:w}},"ga"),onCommit:o}),De=u("adjust","Adjust",!1,["adjust"],Be.el,lt.el,qe.el,Ne.el,Ct.el),Ft=Oe({label:"Alpha cutoff",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,help:"Pixels less opaque than this become transparent.",onInput:w=>n({alpha:{threshold:w}},"alpha"),onCommit:o}),et=It({label:"Remove stray pixels",onChange:w=>n({cleanup:{orphans:w}})}),Me=It({label:"Smooth small specks",onChange:w=>n({cleanup:{smooth:w}})}),Ye=Wt({label:"Outline",options:[{value:"none",label:"None"},{value:"outer",label:"Outside"},{value:"inner",label:"Inside"}],value:"none",help:"Follows transparent edges.",onChange:w=>n({outline:{mode:w}})}),Ae=fi({label:"Outline colour",onChange:w=>n({outline:{color:w}},"olc")}),ht=It({label:"Include diagonals",onChange:w=>n({outline:{corners:w}})}),Fe=u("cleanup","Cleanup & outline",!1,["cleanup","outline","alpha"],et.el,Me.el,Ft.el,Ye.el,Ae.el,ht.el),mt=m("div",{id:"itp-pane-setup",role:"tabpanel","aria-labelledby":"itp-tab-setup"},D.el,de.el,ce.el,ie.el,De.el,Fe.el),tt=Wt({label:"Size",options:[{value:"scale",label:"Scale"},{value:"source",label:"Source size"}],value:"scale",help:"",onChange:w=>n({export:{size:w}})}),St=Oe({label:"Scale",min:1,max:32,step:1,value:4,reset:4,help:"Whole-number upscale keeps every pixel square.",onInput:w=>n({export:{scale:w}},"scale"),onCommit:o}),Ce=m("span.val.num",{}),Tt=It({label:"Grid lines",onChange:w=>n({export:{grid:w}})}),nt=It({label:"Indexed PNG",help:"Smaller files; up to 256 colours.",onChange:w=>n({export:{indexed:w}})}),Ke=m("button.itp-btn.primary.block",{type:"button",html:`${Q("download")}<span>Download PNG</span>`,onclick:()=>e.exportPNG()}),ot=m("button.itp-btn.outline.block",{type:"button",html:`${Q("copy")}<span>Copy image</span>`,onclick:()=>e.copyImage()}),gt=m("button.itp-btn.outline.block",{type:"button",html:`${Q("zip")}<span>Download all as ZIP</span>`,onclick:()=>e.exportZip()}),ut=u("image","Image",!0,["export"],Mt("Output size",m("div"),{value:Ce}),tt.el,St.el,Tt.el,nt.el,m("div.itp-grid2",{},Ke,ot),gt),Ge=Ut({label:"Frames from",options:[{value:"video",label:"Current video"},{value:"files",label:"All files, in order"}],onChange:()=>K()}),dt=Ut({label:"Format",options:[{value:"gif",label:"GIF"},{value:"webm",label:"WebM video"},{value:"mp4",label:"MP4 video"},{value:"png-seq",label:"PNG sequence (ZIP)"}],onChange:()=>K()}),je=qt({label:"Frames per second",min:1,max:60,onChange:()=>{}}),Le=qt({label:"Start (s)",min:0,max:36e3,step:.1,onChange:()=>{}}),rt=qt({label:"End (s)",min:0,max:36e3,step:.1,onChange:()=>{}}),$e=Ut({label:"Video size",options:[{value:"1080",label:"Full HD (sharp in any player)"},{value:"720",label:"720p"},{value:"2160",label:"4K"},{value:"scale",label:"Same scale as PNG"}],onChange:()=>{}});$e.set("1080");let Ze=It({label:"Keep audio",help:"The video's soundtrack, cut to the same start and end. MP4 and WebM only.",onChange:()=>K()}),At=Ze.el.querySelector("input"),He=m("div.help",{}),_t=m("button.itp-btn.primary.block",{type:"button",html:`${Q("film")}<span>Export animation</span>`,onclick:()=>e.exportAnimation($t())}),Pt=u("animation","Animation",!1,null,Ge.el,dt.el,je.el,m("div.itp-grid2",{},Le.el,rt.el),$e.el,Ze.el,He,_t);je.set(12),Le.set(0),rt.set(0),Ze.set(!0);let $t=()=>({source:Ge.select.value,format:dt.select.value,fps:Number(je.input.value)||12,start:Number(Le.input.value)||0,end:Number(rt.input.value)||0,audio:At.checked,videoSize:$e.select.value}),it=qt({label:"Columns",min:0,max:256,help:"0 = as square as possible.",onChange:()=>{}}),Je=qt({label:"Padding",min:0,max:64,onChange:()=>{}});it.set(0),Je.set(0);let bt=m("button.itp-btn.outline.block",{type:"button",html:`${Q("sheet")}<span>Download sprite sheet</span>`,onclick:()=>e.exportSheet({...$t(),columns:Number(it.input.value)||0,padding:Number(Je.input.value)||0})}),Kt=u("sheet","Sprite sheet",!1,null,m("div.help",{text:"Packs the frames chosen under Animation into one PNG with a JSON atlas (TexturePacker hash format)."}),m("div.itp-grid2",{},it.el,Je.el),bt),yt=Ut({label:"Tile size",options:[8,12,16,24,32,48,64].map(w=>({value:String(w),label:`${w} \xD7 ${w}`})),onChange:()=>{}});yt.set("16");let Re=It({label:"Count mirrored tiles as duplicates",onChange:()=>{}}),zt=m("button.itp-btn.outline.block",{type:"button",html:`${Q("tiles")}<span>Download tileset</span>`,onclick:()=>e.exportTileset({tile:Number(yt.select.value),flips:Re.el.querySelector("input").checked})}),Zt=u("tileset","Tileset",!1,null,m("div.help",{text:"Cuts the current result into tiles, keeps one copy of each and writes a tile map."}),yt.el,Re.el,zt),ve=u("settings","Settings",!1,null,m("div.itp-grid2",{},m("button.itp-btn.outline",{type:"button",html:`${Q("link")}<span>Copy link</span>`,onclick:()=>e.copyLink()}),m("button.itp-btn.outline",{type:"button",html:`${Q("braces")}<span>Save JSON</span>`,onclick:()=>e.saveSettingsFile()})),m("button.itp-btn.outline.block",{type:"button",html:`${Q("upload")}<span>Load settings file</span>`,onclick:()=>e.loadSettingsFile()})),Bt=m("div",{id:"itp-pane-export",role:"tabpanel","aria-labelledby":"itp-tab-export",hidden:!0},ut.el,Pt.el,Kt.el,Zt.el,ve.el),T=m("div.itp-insp-foot",{},m("button.itp-link",{type:"button",text:"Reset to defaults",onclick:()=>e.resetSettings()}),m("span.muted",{style:{fontSize:"var(--fs-xs)"},id:"itp-backend"})),O=m("div.itp-panel-body",{},mt,Bt),$=m("aside.itp-insp",{"aria-label":"Inspector"},m("div.itp-insp-head",{},f,x,E),m("div",{style:{height:"8px"}}),O,T);function V(w){let G=w==="setup";h.setAttribute("aria-selected",String(G)),y.setAttribute("aria-selected",String(!G)),mt.hidden=!G,Bt.hidden=G,G||K()}h.onclick=()=>V("setup"),y.onclick=()=>V("export"),E.addEventListener("keydown",w=>{if(w.key==="ArrowRight"||w.key==="ArrowLeft"){let G=h.getAttribute("aria-selected")==="true"?y:h;G.click(),G.focus()}});function K(){let w=e.current,G=w&&w.type==="video",ne=e.items.filter(X=>X.type==="image").length;!G&&Ge.select.value==="video"&&ne>1&&Ge.set("files"),G&&Ge.select.value==="files"&&ne<2&&Ge.set("video");let d=Ge.select.value,g=d==="video"?G:ne>1;Le.el.hidden=rt.el.hidden=d!=="video",_t.disabled=!g,bt.disabled=!g,G&&!Number(rt.input.value)&&rt.set(Math.round((w.duration||0)*10)/10),G&&w.fps&&!je.input.dataset.touched&&je.set(Math.min(30,Math.round(w.fps)));let k=dt.select.value,A=k==="mp4"||k==="webm";Ze.el.hidden=!(d==="video"&&A),$e.el.hidden=!A;let U=e.videoSupport,B=U&&"opus"in U&&At.checked&&!Ze.el.hidden&&!(k==="mp4"&&U.aac||U.opus);He.textContent=g?A&&!U?.[k]?`${k.toUpperCase()} encoding isn't available in this browser. GIF and PNG sequence always work.`:B?"This browser can't encode audio, so the video will be silent.":k==="mp4"&&U&&"aac"in U&&!U.aac&&U.opus&&At.checked&&!Ze.el.hidden?"This browser can't encode AAC, so the MP4's sound will be Opus, which Windows Media Player and QuickTime may not play. WebM, or Chrome/Edge on Windows or macOS, avoids that.":"":d==="video"?"Open a video to export an animation.":"Add two or more images to animate them."}je.input.addEventListener("change",()=>{je.input.dataset.touched="1"});function H(w,G){st(we,...w.map((ne,d)=>{let g=m("button.itp-swatch",{type:"button",role:"listitem",title:G?`${ne}. Click to change, Alt+click to remove`:ne,style:{background:ne}});return g.setAttribute("aria-label",G?`${ne}, edit`:ne),G?g.addEventListener("click",k=>{if(k.altKey){let U=i().palette.colors.filter((B,X)=>X!==d);U.length&&n({palette:{colors:U}});return}let A=m("input",{type:"color",value:ne,style:{position:"fixed",opacity:0,pointerEvents:"none"}});document.body.append(A),A.addEventListener("input",()=>{let U=i().palette.colors.slice();U[d]=A.value,n({palette:{colors:U}},"sw"+d)}),A.addEventListener("change",()=>A.remove()),A.click()}):g.addEventListener("click",()=>{n({palette:{source:"custom",colors:i().palette.colors.slice(),name:`${i().palette.name} (edited)`}}),e.toast("Copied to a custom palette you can edit")}),g}),G?m("button.itp-swatch.add",{type:"button","aria-label":"Add colour",title:"Add colour",html:Q("plus"),onclick:()=>n({palette:{colors:[...i().palette.colors,"#808080"]}})}):null)}let J="";function ae(w,G){S.set(w.size.mode),j.hidden=w.size.mode!=="width",C.hidden=w.size.mode!=="block",b.set(w.size.width),_.set(w.size.height||""),L.set(w.size.block),P.set(w.size.resample),D.setHint(G?`${G.width} \xD7 ${G.height}`:""),oe.set(w.palette.source),ee.set(w.palette.id),ee.el.hidden=w.palette.source!=="builtin",te.el.hidden=w.palette.source!=="extract",te.set(w.palette.count),Y.set(w.palette.distance),Y.el.hidden=w.palette.source==="none",W.hidden=w.palette.source==="none";let ne=w.palette.source==="extract"?G&&G.palette||[]:w.palette.colors,d=w.palette.source+ne.join();d!==J&&(J=d,H(ne,w.palette.source==="custom")),ue.textContent=String(ne.length),ce.setHint(w.palette.source==="none"?"None":w.palette.name),me.set(w.dither.method),pe.set(w.dither.strength);let g=Mn(w.dither.method);pe.el.hidden=g==="none",ke.hidden=w.dither.method!=="custom",w.dither.method==="custom"&&document.activeElement!==ge&&(ge.value=(w.dither.matrix||[]).map(Ve=>Ve.join(" ")).join(`
305
- `)),ie.setHint(w.palette.source==="none"?"Needs a palette":cn.find(Ve=>Ve.id===w.dither.method).label),ie.el.querySelector("select").disabled=w.palette.source==="none",Be.set(w.adjust.brightness),lt.set(w.adjust.contrast),qe.set(w.adjust.saturation),Ne.set(w.adjust.hue),Ct.set(w.adjust.gamma);let k=w.adjust.brightness||w.adjust.contrast||w.adjust.saturation||w.adjust.hue||w.adjust.gamma!==1;F.forEach((Ve,Qe)=>Ve.setAttribute("aria-pressed",String(Jt[Qe].id===w.frame.aspect))),N.set(w.frame.zoom),z.set(w.frame.x),se.set(w.frame.y);let A=e.current,U=A?Cn(A.width,A.height,w.frame):null;z.el.hidden=!U||U.w>=A.width,se.el.hidden=!U||U.h>=A.height;let B=w.frame.aspect!=="original"||w.frame.zoom>1;de.setHint(B?[w.frame.aspect!=="original"?w.frame.aspect:"",w.frame.zoom>1?`${Math.round(w.frame.zoom*100)/100}\xD7`:""].filter(Boolean).join(", "):""),de.setChanged(!a(w.frame,r.frame));let X=e.items.length>1;x.hidden=!(A&&(X||A.own)),v.set(A&&A.own?"own":"shared");let re=e.items.filter(Ve=>!Ve.own).length;M.textContent=A&&A.own?"Only this file":`${re} ${re===1?"file":"files"}`,$.dataset.scope=A&&A.own?"own":"shared",De.setHint(k?"Changed":""),Ft.set(w.alpha.threshold),et.set(w.cleanup.orphans),Me.set(w.cleanup.smooth),Ye.set(w.outline.mode),Ae.set(w.outline.color),ht.set(w.outline.corners),Ae.el.hidden=ht.el.hidden=w.outline.mode==="none";let fe=[w.cleanup.orphans&&"strays",w.cleanup.smooth&&"smooth",w.outline.mode!=="none"&&"outline"].filter(Boolean);Fe.setHint(fe.join(", ")),D.setChanged(!a(w.size,r.size)),ce.setChanged(!a(w.palette,r.palette)),ie.setChanged(!a(w.dither,r.dither)),De.setChanged(!a(w.adjust,r.adjust)),Fe.setChanged(!a([w.cleanup,w.outline,w.alpha],[r.cleanup,r.outline,r.alpha])),ut.setChanged(!a(w.export,r.export)),St.set(w.export.scale),Tt.set(w.export.grid),nt.set(w.export.indexed),tt.set(w.export.size),St.el.hidden=Tt.el.hidden=w.export.size==="source";let _e=Xn(w,G,e.current);Ce.textContent=G?`${_e.width} \xD7 ${_e.height} px`:"\u2013",tt.el.querySelector(".help")?.remove(),w.export.size==="source"&&tt.el.append(m("div.help",{text:"The size of the framed part of the source, like a full-resolution download. Pixels can differ by one in size when the ratio isn't a whole number."})),gt.hidden=e.items.length<2,gt.querySelector("span").textContent=`Download all ${e.items.length} as ZIP`,K()}function ye(w){if(!w){s.textContent=l.textContent=p.textContent="\u2013";return}s.innerHTML=`${w.width}<small>\xD7 ${w.height}</small>`;let G=w.usedColors().length;l.innerHTML=w.palette?`${G}<small>/ ${w.palette.length}</small>`:`${G}`,p.innerHTML=`${w.ms<10?w.ms.toFixed(1):Math.round(w.ms)}<small>ms</small>`,p.parentElement.title=w.backend==="webgl"?"Rendered on the GPU (WebGL 2 via ShaderMate)":"Rendered on the CPU"}return{el:$,sync:ae,setStats:ye,setTab:V,syncAnim:K}}function Ii(e){let t="files",n=(P,R,j)=>m("button",{type:"button",role:"tab",title:R,"aria-selected":String(P===t),html:`${Q(j)}<span>${R}</span>`,onclick:()=>f(P)}),o=n("files","Files","files"),i=n("presets","Presets","presets"),r=n("palettes","Palettes","palette"),a=m("span.count",{});o.append(a);let c=m("div.itp-seg",{role:"tablist","aria-label":"Library"},o,i,r),u=m("input",{type:"search",placeholder:"Search","aria-label":"Search the library"}),s=m("div.itp-search",{},m("span",{html:Q("search")}),u);u.addEventListener("input",()=>L());let l=m("div.itp-panel-body",{}),p=m("aside.itp-lib",{"aria-label":"Library"},m("div.itp-panel-head",{},c),s,l);function f(P){t=P;for(let[R,j]of[[o,"files"],[i,"presets"],[r,"palettes"]])R.setAttribute("aria-selected",String(j===P));u.value="",L(),P==="presets"&&!v.size&&S()}let h=()=>u.value.trim().toLowerCase();function y(P,R){let j=e.items.indexOf(P),C=e.items.length>1;hn(R,[P.own?{label:"Use shared settings",sub:"Drop this file's own settings",icon:"link",onClick:()=>e.setOwn(P,!1)}:{label:"Give it its own settings",sub:"Edits stop affecting other files",icon:"unlink",disabled:!C,onClick:()=>e.setOwn(P,!0)},"sep",{label:"Copy settings",icon:"copy",onClick:()=>e.copySettings(P)},{label:"Paste settings",sub:e.clipboard?"Gives this file its own settings":"Copy settings from a file first",icon:"clipboard",disabled:!e.clipboard,onClick:()=>e.pasteSettings(P)},{label:"Apply these settings to all files",icon:"layers",disabled:!C,onClick:()=>e.applyToAll(P)},"sep",{label:"Rename",sub:"Exports are named after it",icon:"rename",kbd:"F2",onClick:()=>e.startRename(P)},{label:"Duplicate",sub:"A copy with its own settings, to compare looks",icon:"copy",onClick:()=>e.duplicate(P)},{label:"Move up",icon:"arrowUp",kbd:"Alt Shift \u2191",disabled:j<=0,onClick:()=>e.move(P,-1)},{label:"Move down",icon:"arrowDown",kbd:"Alt Shift \u2193",disabled:j>=e.items.length-1,onClick:()=>e.move(P,1)},"sep",{label:"Remove",icon:"trash",kbd:"Del",onClick:()=>e.removeItem(P)}],{align:"start"})}function E(){let P=e.items.filter(z=>!h()||z.name.toLowerCase().includes(h())),R=m("ul.itp-files",{"aria-label":"Files"});for(let z of P){let se=m("button.itp-btn.small.icon",{type:"button","aria-label":`Options for ${z.name}`,"aria-haspopup":"menu",title:"Settings, duplicate, order",html:Q("more"),onclick:ee=>{ee.stopPropagation(),y(z,se)}}),de=z.type==="video"?`Video, ${yn(z.duration)}`:`${z.width} \xD7 ${z.height}`,oe=m("li.itp-file-row",{tabindex:"0","aria-current":String(e.current===z),"data-own":z.own?"true":null},m("img.thumb",{src:z.thumb||"",alt:""}),m("div",{style:{minWidth:0}},m("div.title",{text:z.name}),m("div.sub",{},de,z.own?m("span.itp-own",{title:"This file has its own settings",html:`${Q("unlink")}<span>Own</span>`}):null)),m("div.actions",{},se,m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Remove ${z.name}`,title:"Remove",html:Q("x"),onclick:ee=>{ee.stopPropagation(),e.removeItem(z)}})));oe.addEventListener("click",()=>e.select(z)),oe.addEventListener("dblclick",ee=>{ee.target.closest(".title")&&e.startRename(z)}),oe.addEventListener("contextmenu",ee=>{ee.preventDefault(),e.select(z),y(z,se)}),oe.addEventListener("keydown",ee=>{ee.target===oe&&((ee.key==="Enter"||ee.key===" ")&&(ee.preventDefault(),e.select(z)),(ee.key==="Delete"||ee.key==="Backspace")&&(ee.preventDefault(),e.removeItem(z)),!ee.altKey&&(ee.key==="ArrowDown"&&(ee.preventDefault(),oe.nextElementSibling?.focus()),ee.key==="ArrowUp"&&(ee.preventDefault(),oe.previousElementSibling?.focus()),(ee.key==="ContextMenu"||ee.key==="F10"&&ee.shiftKey)&&(ee.preventDefault(),y(z,se))))}),R.append(oe)}let j=e.items.filter(z=>z.own).length,C=e.items.length?e.items.length===1?"1 file":j?`${e.items.length} files, ${j} with ${j===1?"its":"their"} own settings`:`${e.items.length} files, shared settings`:"No files yet",D=m("div.itp-group",{},m("span",{text:C}),e.items.length>1?m("button.itp-link",{type:"button",text:"Clear",onclick:()=>e.clearItems()}):null),F=m("div",{style:{padding:"4px 12px 12px",display:"flex",gap:"6px"}},m("button.itp-btn.outline.small",{type:"button",html:`${Q("plus")}<span>Add files</span>`,onclick:()=>e.openFiles()}),m("button.itp-btn.small",{type:"button",html:`${Q("clipboard")}<span>Paste</span>`,title:"Paste an image from the clipboard (Ctrl+V)",onclick:()=>e.pasteFromClipboard()})),I=e.savedWorkspace&&e.savedWorkspace(),N=I?m("div.itp-group.itp-saved",{},m("span",{text:`Saved in this browser: ${I.count} file${I.count===1?"":"s"}`,title:"Kept in this browser's storage, never uploaded. Clearing the site's data also removes it."}),m("button.itp-link",{type:"button",text:"Forget",title:"Remove the saved files from this browser",onclick:()=>e.forgetWorkspace()})):null;st(l,D,R,F,N,m("div.itp-group",{},m("span",{text:"Drop images or videos anywhere in the window. Files share one set of settings unless you give one its own (\u22EF menu or right-click). Save keeps them in this browser for next time."})))}let v=new Map,M=0;function x(){let P=e.store.settings,R=dn.filter(C=>!h()||(C.name+C.description).toLowerCase().includes(h())),j=m("div.itp-presets",{});for(let C of R){let D=e.activePreset===C.id,F=v.get(C.id)||m("div.ph",{}),I=m("button.itp-preset",{type:"button","aria-pressed":String(D),title:C.description,onclick:()=>e.applyPreset(C)},F,m("span.t",{text:C.name}),m("span.d",{text:C.description}));j.append(I)}st(l,m("div.itp-group",{},m("span",{text:"Presets replace the current settings. Undo with Ctrl+Z."})),j)}async function S(){let P=++M,R=e.current;if(!(!R||!e.engine))for(let j of dn){if(P!==M)return;let C=Lt(Et(),j.settings);C.size={...C.size,mode:"width",width:Math.min(C.size.width,72),height:0};try{let D=await e.engine.process(R.source,C);if(P!==M)return;let F=D.toCanvas(1);v.set(j.id,F),t==="presets"&&x()}catch{}}}function b(P,R,j){let C=m("div.itp-strip",{},...P.colors.slice(0,64).map(I=>m("i",{style:{background:I.startsWith("#")?I:"#"+I}}))),D=m("li.itp-pal",{tabindex:"0",role:"button","aria-pressed":String(R)},m("div.row",{},m("span",{text:P.name}),m("span.n",{text:String(P.colors.length),title:P.author?`by ${P.author}`:null})),C),F=()=>e.usePalette(P);if(D.addEventListener("click",F),D.addEventListener("keydown",I=>{(I.key==="Enter"||I.key===" ")&&(I.preventDefault(),F()),j&&I.key==="Delete"&&e.deletePalette(P)}),j){let I=m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Delete ${P.name}`,title:"Delete",html:Q("trash"),onclick:N=>{N.stopPropagation(),e.deletePalette(P)}});D.firstChild.append(I)}return D}function _(){let P=e.store.settings.palette,R=I=>!h()||(I.name+" "+(I.author||"")).toLowerCase().includes(h())||String(I.colors.length)===h(),j=e.userPalettes.filter(R),C=an.filter(R),D=m("div",{style:{padding:"0 12px 4px",display:"flex",gap:"6px",flexWrap:"wrap"}},m("button.itp-btn.outline.small",{type:"button",html:`${Q("upload")}<span>Import file</span>`,onclick:()=>e.importPalette()}),m("button.itp-btn.small",{type:"button",html:`${Q("palette")}<span>From Lospec</span>`,onclick:()=>e.lospecDialog()})),F=j.length?[m("div.itp-group",{},m("span",{text:"Your palettes"}),m("span.itp-badge",{text:String(j.length)})),m("ul.itp-pal-list",{},...j.map(I=>b(I,P.source==="custom"&&P.name===I.name,!0)))]:[];st(l,D,...F,m("div.itp-group",{},m("span",{text:"Built-in"}),m("span.itp-badge",{text:String(C.length)})),m("ul.itp-pal-list",{},...C.map(I=>b({...I,colors:I.colors.map(N=>"#"+N)},P.source==="builtin"&&P.id===I.id,!1))))}function L(){a.textContent=e.items.length?String(e.items.length):"",t==="files"?E():t==="presets"?x():_()}return{el:p,refresh:L,setTab:f,focusFile(P){t==="files"&&l.querySelectorAll(".itp-file-row")[e.items.indexOf(P)]?.focus()},sourceChanged(){v.clear(),M++,t==="presets"&&(L(),S())},get tab(){return t}}}function yn(e=0){let t=Math.floor(e/60),n=e-t*60;return`${t}:${n.toFixed(1).padStart(4,"0")}`}var nc=`<svg xmlns="http://www.w3.org/2000/svg" width="960" height="640" viewBox="0 0 960 640">
304
+ 15 7 13 5`}),Se=m("div.help",{text:"Rows of numbers, up to 16\xD716. Only their order matters."});pe.addEventListener("change",()=>{try{n({dither:{method:"custom",matrix:sr(pe.value)}}),Se.textContent="Rows of numbers, up to 16\xD716. Only their order matters.",Se.style.color=""}catch(E){Se.textContent=E.message,Se.style.color="var(--danger)"}});let Ie=m("div.itp-field",{},m("div.lab",{},m("span",{text:"Matrix"})),pe,Se),Re=l("dither","Dither",!1,["dither"],ge.el,be.el,Ie),Ze={min:-1,max:1,step:.01,scale:100,value:0,reset:0},ce=ht({label:"Brightness",...Ze,onInput:E=>n({adjust:{brightness:E}},"br"),onCommit:o}),Je=ht({label:"Contrast",...Ze,onInput:E=>n({adjust:{contrast:E}},"co"),onCommit:o}),nt=ht({label:"Saturation",...Ze,onInput:E=>n({adjust:{saturation:E}},"sa"),onCommit:o}),Oe=ht({label:"Hue",min:-180,max:180,step:1,value:0,reset:0,help:"Rotates every colour around the colour wheel; greys stay grey.",onInput:E=>n({adjust:{hue:E}},"hu"),onCommit:o}),Ye=ht({label:"Gamma",min:.2,max:3,step:.05,value:1,reset:1,onInput:E=>n({adjust:{gamma:E}},"ga"),onCommit:o}),ot=l("adjust","Adjust",!1,["adjust"],ce.el,Je.el,nt.el,Oe.el,Ye.el),St=ht({label:"Alpha cutoff",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,help:"Pixels less opaque than this become transparent.",onInput:E=>n({alpha:{threshold:E}},"alpha"),onCommit:o}),rt=Nt({label:"Remove stray pixels",onChange:E=>n({cleanup:{orphans:E}})}),Ue=Nt({label:"Smooth small specks",onChange:E=>n({cleanup:{smooth:E}})}),We=en({label:"Outline",options:[{value:"none",label:"None"},{value:"outer",label:"Outside"},{value:"inner",label:"Inside"}],value:"none",help:"Follows transparent edges.",onChange:E=>n({outline:{mode:E}})}),qe=Si({label:"Outline colour",onChange:E=>n({outline:{color:E}},"olc")}),Et=Nt({label:"Include diagonals",onChange:E=>n({outline:{corners:E}})}),mt=l("cleanup","Cleanup & outline",!1,["cleanup","outline","alpha"],rt.el,Ue.el,St.el,We.el,qe.el,Et.el),Be=m("div",{id:"itp-pane-setup",role:"tabpanel","aria-labelledby":"itp-tab-setup"},O.el,ke.el,xe.el,Re.el,ot.el,mt.el),gt=en({label:"Size",options:[{value:"scale",label:"Scale"},{value:"source",label:"Source size"}],value:"scale",help:"",onChange:E=>n({export:{size:E}})}),Fe=ht({label:"Scale",min:1,max:32,step:1,value:4,reset:4,help:"Whole-number upscale keeps every pixel square.",onInput:E=>n({export:{scale:E}},"scale"),onCommit:o}),Ge=m("span.val.num",{}),st=Nt({label:"Grid lines",onChange:E=>n({export:{grid:E}})}),bt=Nt({label:"Indexed PNG",help:"Smaller files; up to 256 colours.",onChange:E=>n({export:{indexed:E}})}),kt=m("button.itp-btn.primary.block",{type:"button",html:`${ie("download")}<span>Download PNG</span>`,onclick:()=>e.exportPNG()}),yt=m("button.itp-btn.outline.block",{type:"button",html:`${ie("copy")}<span>Copy image</span>`,onclick:()=>e.copyImage()}),He=m("button.itp-btn.outline.block",{type:"button",html:`${ie("zip")}<span>Download all as ZIP</span>`,onclick:()=>e.exportZip()}),It=l("image","Image",!0,["export"],Bt("Output size",m("div"),{value:Ge}),gt.el,Fe.el,st.el,bt.el,m("div.itp-grid2",{},kt,yt),He),De={active:!1,complete:!1,count:0},$e=Xt({label:"Frames from",options:[{value:"video",label:"Current video"},{value:"files",label:"All files, in order"}],onChange:()=>le()}),ct=Nt({label:"Frame selection",help:"Choose individual video frames on the canvas for animation and sprite sheet exports.",onChange:E=>{if(E){$e.set("video");let X=e.current?.type==="video"?e.current:null;X&&!Ve.input.dataset.touched&&!Ne.input.dataset.touched&&Wo(Number(Ne.input.value)||0,X.duration)&&(Ve.set(0),Ne.set(Math.min(X.duration,Xo)))}e.setFrameSelection(E)}}),Qe=Xt({label:"Format",options:[{value:"gif",label:"GIF"},{value:"webm",label:"WebM video"},{value:"mp4",label:"MP4 video"},{value:"png-seq",label:"PNG sequence (ZIP)"}],onChange:()=>le()}),je=tn({label:"Frames per second",min:1,max:60,onChange:E=>{je.input.dataset.touched="1",e.setAnimationFps?.(E)}}),lt=()=>{Ve.input.dataset.touched="1",Ne.input.dataset.touched="1",e.setFrameRange?.(Number(Ve.input.value)||0,Number(Ne.input.value)||0)},Ve=tn({label:"Start (s)",min:0,max:36e3,step:.001,onChange:lt}),Ne=tn({label:"End (s)",min:0,max:36e3,step:.001,onChange:lt}),it=Xt({label:"Video size",options:[{value:"1080",label:"Full HD (sharp in any player)"},{value:"720",label:"720p"},{value:"2160",label:"4K"},{value:"scale",label:"Same scale as PNG"}],onChange:()=>{}});it.set("1080");let xt=Nt({label:"Keep audio",help:"The video's soundtrack, cut to the same start and end. MP4 and WebM only.",onChange:()=>le()}),Ct=xt.el.querySelector("input"),Lt=m("div.help",{}),ut=m("button.itp-btn.primary.block",{type:"button",html:`${ie("film")}<span>Export animation</span>`,onclick:()=>e.exportAnimation(dt())}),Ke=l("animation","Animation",!1,null,$e.el,ct.el,Qe.el,je.el,m("div.itp-grid2",{},Ve.el,Ne.el),it.el,xt.el,Lt,ut);je.set(12),Ve.set(0),Ne.set(0),xt.set(!0);let dt=()=>({source:$e.select.value,format:Qe.select.value,fps:Number(je.input.value)||12,start:Number(Ve.input.value)||0,end:Number(Ne.input.value)||0,rangeTouched:!!(Ve.input.dataset.touched||Ne.input.dataset.touched),audio:Ct.checked,videoSize:it.select.value}),L=tn({label:"Columns",min:0,max:256,help:"0 = as square as possible.",onChange:()=>{}}),$=tn({label:"Padding",min:0,max:64,onChange:()=>{}});L.set(0),$.set(0);let Y=m("button.itp-btn.outline.block",{type:"button",html:`${ie("sheet")}<span>Download sprite sheet</span>`,onclick:()=>e.exportSheet({...dt(),columns:Number(L.input.value)||0,padding:Number($.input.value)||0})}),oe=l("sheet","Sprite sheet",!1,null,m("div.help",{text:"Packs the frames chosen under Animation into one PNG with a JSON atlas (TexturePacker hash format)."}),m("div.itp-grid2",{},L.el,$.el),Y),he=Xt({label:"Tile size",options:[8,12,16,24,32,48,64].map(E=>({value:String(E),label:`${E} \xD7 ${E}`})),onChange:()=>{}});he.set("16");let ae=Nt({label:"Count mirrored tiles as duplicates",onChange:()=>{}}),Le=m("button.itp-btn.outline.block",{type:"button",html:`${ie("tiles")}<span>Download tileset</span>`,onclick:()=>e.exportTileset({tile:Number(he.select.value),flips:ae.el.querySelector("input").checked})}),C=l("tileset","Tileset",!1,null,m("div.help",{text:"Cuts the current result into tiles, keeps one copy of each and writes a tile map."}),he.el,ae.el,Le),U=l("settings","Settings",!1,null,m("div.itp-grid2",{},m("button.itp-btn.outline",{type:"button",html:`${ie("link")}<span>Copy link</span>`,onclick:()=>e.copyLink()}),m("button.itp-btn.outline",{type:"button",html:`${ie("braces")}<span>Save JSON</span>`,onclick:()=>e.saveSettingsFile()})),m("button.itp-btn.outline.block",{type:"button",html:`${ie("upload")}<span>Load settings file</span>`,onclick:()=>e.loadSettingsFile()})),B=m("div",{id:"itp-pane-export",role:"tabpanel","aria-labelledby":"itp-tab-export",hidden:!0},It.el,Ke.el,oe.el,C.el,U.el),K=m("div.itp-insp-foot",{},m("button.itp-link",{type:"button",text:"Reset to defaults",onclick:()=>e.resetSettings()}),m("span.muted",{style:{fontSize:"var(--fs-xs)"},id:"itp-backend"})),re=m("div.itp-panel-body",{},Be,B),j=m("aside.itp-insp",{"aria-label":"Inspector"},m("div.itp-insp-head",{},f,x,M),m("div",{style:{height:"8px"}}),re,K);function te(E){let X=E==="setup";p.setAttribute("aria-selected",String(X)),b.setAttribute("aria-selected",String(!X)),Be.hidden=!X,B.hidden=X,X||le()}p.onclick=()=>te("setup"),b.onclick=()=>te("export"),M.addEventListener("keydown",E=>{if(E.key==="ArrowRight"||E.key==="ArrowLeft"){let X=p.getAttribute("aria-selected")==="true"?b:p;X.click(),X.focus()}});function le(){let E=e.current?.type==="video"?e.current:null,X=!!E,ue=e.items.filter(Ee=>Ee.type==="image").length;!X&&$e.select.value==="video"&&ue>1&&$e.set("files"),X&&$e.select.value==="files"&&ue<2&&$e.set("video");let Me=$e.select.value,J=Me==="video"?X:ue>1,u=De.active;ct.el.hidden=!E,ct.set(u),$e.select.disabled=u,Ve.el.hidden=Ne.el.hidden=Me!=="video",ut.disabled=Y.disabled=!J||u&&(!De.complete||!De.count),kt.disabled=yt.disabled=Le.disabled=u,E&&!Number(Ne.input.value)&&Ne.set(Math.round((E.duration||0)*10)/10),E&&E.fps&&!je.input.dataset.touched&&je.set(Math.min(30,Math.round(E.fps))),e.setAnimationFps?.(Number(je.input.value)||12);let g=Qe.select.value,S=g==="mp4"||g==="webm";xt.el.hidden=u||!(Me==="video"&&S),it.el.hidden=!S;let R=e.videoSupport,q=R&&"opus"in R&&Ct.checked&&!xt.el.hidden&&!(g==="mp4"&&R.aac||R.opus),Z=u?De.complete?De.count?`${De.count} selected frames, played at ${Number(je.input.value)||12} fps.${S?" Selected frames export without source audio.":""} Turn off frame selection to use PNG, Copy or Tileset.`:"Select frames on the canvas to enable export.":"Loading video frames...":"",ne=J?S&&!R?.[g]?`${g.toUpperCase()} encoding isn't available in this browser. GIF and PNG sequence always work.`:q?"This browser can't encode audio, so the video will be silent.":g==="mp4"&&R&&"aac"in R&&!R.aac&&R.opus&&Ct.checked&&!xt.el.hidden?"This browser can't encode AAC, so the MP4's sound will be Opus, which Windows Media Player and QuickTime may not play. WebM, or Chrome/Edge on Windows or macOS, avoids that.":"":Me==="video"?"Open a video to export an animation.":"Add two or more images to animate them.";Lt.textContent=[Z,ne].filter(Boolean).join(" ")}je.input.addEventListener("change",le);function Ae(E,X){At(ze,...E.map((ue,Me)=>{let J=m("button.itp-swatch",{type:"button",role:"listitem",title:X?`${ue}. Click to change, Alt+click to remove`:ue,style:{background:ue}});return J.setAttribute("aria-label",X?`${ue}, edit`:ue),X?J.addEventListener("click",u=>{if(u.altKey){let S=i().palette.colors.filter((R,q)=>q!==Me);S.length&&n({palette:{colors:S}});return}let g=m("input",{type:"color",value:ue,style:{position:"fixed",opacity:0,pointerEvents:"none"}});document.body.append(g),g.addEventListener("input",()=>{let S=i().palette.colors.slice();S[Me]=g.value,n({palette:{colors:S}},"sw"+Me)}),g.addEventListener("change",()=>g.remove()),g.click()}):J.addEventListener("click",()=>{n({palette:{source:"custom",colors:i().palette.colors.slice(),name:`${i().palette.name} (edited)`}}),e.toast("Copied to a custom palette you can edit")}),J}),X?m("button.itp-swatch.add",{type:"button","aria-label":"Add colour",title:"Add colour",html:ie("plus"),onclick:()=>n({palette:{colors:[...i().palette.colors,"#808080"]}})}):null)}let ye="";function we(E,X){w.set(E.size.mode),H.hidden=E.size.mode!=="width",T.hidden=E.size.mode!=="block",y.set(E.size.width),A.set(E.size.height||""),_.set(E.size.block),P.set(E.size.resample),O.setHint(X?`${X.width} \xD7 ${X.height}`:""),fe.set(E.palette.source),se.set(E.palette.id),se.el.hidden=E.palette.source!=="builtin",de.el.hidden=E.palette.source!=="extract",de.set(E.palette.count),V.set(E.palette.distance),V.el.hidden=E.palette.source==="none",W.hidden=E.palette.source==="none";let ue=E.palette.source==="extract"?X&&X.palette||[]:E.palette.colors,Me=E.palette.source+ue.join();Me!==ye&&(ye=Me,Ae(ue,E.palette.source==="custom")),me.textContent=String(ue.length),xe.setHint(E.palette.source==="none"?"None":E.palette.name),ge.set(E.dither.method),be.set(E.dither.strength);let J=Rn(E.dither.method);be.el.hidden=J==="none",Ie.hidden=E.dither.method!=="custom",E.dither.method==="custom"&&document.activeElement!==pe&&(pe.value=(E.dither.matrix||[]).map(_e=>_e.join(" ")).join(`
305
+ `)),Re.setHint(E.palette.source==="none"?"Needs a palette":mn.find(_e=>_e.id===E.dither.method).label),Re.el.querySelector("select").disabled=E.palette.source==="none",ce.set(E.adjust.brightness),Je.set(E.adjust.contrast),nt.set(E.adjust.saturation),Oe.set(E.adjust.hue),Ye.set(E.adjust.gamma);let u=E.adjust.brightness||E.adjust.contrast||E.adjust.saturation||E.adjust.hue||E.adjust.gamma!==1;D.forEach((_e,Mt)=>_e.setAttribute("aria-pressed",String(rn[Mt].id===E.frame.aspect))),G.set(E.frame.zoom),N.set(E.frame.x),ve.set(E.frame.y);let g=e.current,S=g?In(g.width,g.height,E.frame):null;N.el.hidden=!S||S.w>=g.width,ve.el.hidden=!S||S.h>=g.height;let R=E.frame.aspect!=="original"||E.frame.zoom>1;ke.setHint(R?[E.frame.aspect!=="original"?E.frame.aspect:"",E.frame.zoom>1?`${Math.round(E.frame.zoom*100)/100}\xD7`:""].filter(Boolean).join(", "):""),ke.setChanged(!a(E.frame,r.frame));let q=e.items.length>1;x.hidden=!(g&&(q||g.own)),v.set(g&&g.own?"own":"shared");let Z=e.items.filter(_e=>!_e.own).length;k.textContent=g&&g.own?"Only this file":`${Z} ${Z===1?"file":"files"}`,j.dataset.scope=g&&g.own?"own":"shared",ot.setHint(u?"Changed":""),St.set(E.alpha.threshold),rt.set(E.cleanup.orphans),Ue.set(E.cleanup.smooth),We.set(E.outline.mode),qe.set(E.outline.color),Et.set(E.outline.corners),qe.el.hidden=Et.el.hidden=E.outline.mode==="none";let ne=[E.cleanup.orphans&&"strays",E.cleanup.smooth&&"smooth",E.outline.mode!=="none"&&"outline"].filter(Boolean);mt.setHint(ne.join(", ")),O.setChanged(!a(E.size,r.size)),xe.setChanged(!a(E.palette,r.palette)),Re.setChanged(!a(E.dither,r.dither)),ot.setChanged(!a(E.adjust,r.adjust)),mt.setChanged(!a([E.cleanup,E.outline,E.alpha],[r.cleanup,r.outline,r.alpha])),It.setChanged(!a(E.export,r.export)),Fe.set(E.export.scale),st.set(E.export.grid),bt.set(E.export.indexed),gt.set(E.export.size),Fe.el.hidden=st.el.hidden=E.export.size==="source";let Ee=Jn(E,X,e.current);Ge.textContent=X?`${Ee.width} \xD7 ${Ee.height} px`:"\u2013",gt.el.querySelector(".help")?.remove(),E.export.size==="source"&&gt.el.append(m("div.help",{text:"The size of the framed part of the source, like a full-resolution download. Pixels can differ by one in size when the ratio isn't a whole number."})),He.hidden=e.items.length<2,He.querySelector("span").textContent=`Download all ${e.items.length} as ZIP`,le()}function Te(E){if(!E){s.textContent=d.textContent=h.textContent="\u2013";return}s.innerHTML=`${E.width}<small>\xD7 ${E.height}</small>`;let X=E.usedColors().length;d.innerHTML=E.palette?`${X}<small>/ ${E.palette.length}</small>`:`${X}`,h.innerHTML=`${E.ms<10?E.ms.toFixed(1):Math.round(E.ms)}<small>ms</small>`,h.parentElement.title=E.backend==="webgl"?"Rendered on the GPU (WebGL 2 via ShaderMate)":"Rendered on the CPU"}return{el:j,sync:we,setStats:Te,setTab:te,syncAnim:le,animationOptions:dt,setFrameSelectionState(E){De=E,le()},setAnimationRange({start:E,end:X,user:ue=!1}){Ve.set(Number(E.toFixed(3))),Ne.set(Number(X.toFixed(3))),ue&&(Ve.input.dataset.touched="1",Ne.input.dataset.touched="1")}}}function Zi(e){let t="files",n=(P,I,H)=>m("button",{type:"button",role:"tab",title:I,"aria-selected":String(P===t),html:`${ie(H)}<span>${I}</span>`,onclick:()=>f(P)}),o=n("files","Files","files"),i=n("presets","Presets","presets"),r=n("palettes","Palettes","palette"),a=m("span.count",{});o.append(a);let c=m("div.itp-seg",{role:"tablist","aria-label":"Library"},o,i,r),l=m("input",{type:"search",placeholder:"Search","aria-label":"Search the library"}),s=m("div.itp-search",{},m("span",{html:ie("search")}),l);l.addEventListener("input",()=>_());let d=m("div.itp-panel-body",{}),h=m("aside.itp-lib",{"aria-label":"Library"},m("div.itp-panel-head",{},c),s,d);function f(P){t=P;for(let[I,H]of[[o,"files"],[i,"presets"],[r,"palettes"]])I.setAttribute("aria-selected",String(H===P));l.value="",_(),P==="presets"&&!v.size&&w()}let p=()=>l.value.trim().toLowerCase();function b(P,I){let H=e.items.indexOf(P),T=e.items.length>1;vn(I,[P.own?{label:"Use shared settings",sub:"Drop this file's own settings",icon:"link",onClick:()=>e.setOwn(P,!1)}:{label:"Give it its own settings",sub:"Edits stop affecting other files",icon:"unlink",disabled:!T,onClick:()=>e.setOwn(P,!0)},"sep",{label:"Copy settings",icon:"copy",onClick:()=>e.copySettings(P)},{label:"Paste settings",sub:e.clipboard?"Gives this file its own settings":"Copy settings from a file first",icon:"clipboard",disabled:!e.clipboard,onClick:()=>e.pasteSettings(P)},{label:"Apply these settings to all files",icon:"layers",disabled:!T,onClick:()=>e.applyToAll(P)},"sep",{label:"Rename",sub:"Exports are named after it",icon:"rename",kbd:"F2",onClick:()=>e.startRename(P)},{label:"Duplicate",sub:"A copy with its own settings, to compare looks",icon:"copy",onClick:()=>e.duplicate(P)},{label:"Move up",icon:"arrowUp",kbd:"Alt Shift \u2191",disabled:H<=0,onClick:()=>e.move(P,-1)},{label:"Move down",icon:"arrowDown",kbd:"Alt Shift \u2193",disabled:H>=e.items.length-1,onClick:()=>e.move(P,1)},"sep",{label:"Remove",icon:"trash",kbd:"Del",onClick:()=>e.removeItem(P)}],{align:"start"})}function M(){let P=e.items.filter(N=>!p()||N.name.toLowerCase().includes(p())),I=m("ul.itp-files",{"aria-label":"Files"});for(let N of P){let ve=m("button.itp-btn.small.icon",{type:"button","aria-label":`Options for ${N.name}`,"aria-haspopup":"menu",title:"Settings, duplicate, order",html:ie("more"),onclick:se=>{se.stopPropagation(),b(N,ve)}}),ke=N.type==="video"?`Video, ${Tn(N.duration)}`:`${N.width} \xD7 ${N.height}`,fe=m("li.itp-file-row",{tabindex:"0","aria-current":String(e.current===N),"data-own":N.own?"true":null},m("img.thumb",{src:N.thumb||"",alt:""}),m("div",{style:{minWidth:0}},m("div.title",{text:N.name}),m("div.sub",{},ke,N.own?m("span.itp-own",{title:"This file has its own settings",html:`${ie("unlink")}<span>Own</span>`}):null)),m("div.actions",{},ve,m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Remove ${N.name}`,title:"Remove",html:ie("x"),onclick:se=>{se.stopPropagation(),e.removeItem(N)}})));fe.addEventListener("click",()=>e.select(N)),fe.addEventListener("dblclick",se=>{se.target.closest(".title")&&e.startRename(N)}),fe.addEventListener("contextmenu",se=>{se.preventDefault(),e.select(N),b(N,ve)}),fe.addEventListener("keydown",se=>{se.target===fe&&((se.key==="Enter"||se.key===" ")&&(se.preventDefault(),e.select(N)),(se.key==="Delete"||se.key==="Backspace")&&(se.preventDefault(),e.removeItem(N)),!se.altKey&&(se.key==="ArrowDown"&&(se.preventDefault(),fe.nextElementSibling?.focus()),se.key==="ArrowUp"&&(se.preventDefault(),fe.previousElementSibling?.focus()),(se.key==="ContextMenu"||se.key==="F10"&&se.shiftKey)&&(se.preventDefault(),b(N,ve))))}),I.append(fe)}let H=e.items.filter(N=>N.own).length,T=e.items.length?e.items.length===1?"1 file":H?`${e.items.length} files, ${H} with ${H===1?"its":"their"} own settings`:`${e.items.length} files, shared settings`:"No files yet",O=m("div.itp-group",{},m("span",{text:T}),e.items.length>1?m("button.itp-link",{type:"button",text:"Clear",onclick:()=>e.clearItems()}):null),D=m("div",{style:{padding:"4px 12px 12px",display:"flex",gap:"6px"}},m("button.itp-btn.outline.small",{type:"button",html:`${ie("plus")}<span>Add files</span>`,onclick:()=>e.openFiles()}),m("button.itp-btn.small",{type:"button",html:`${ie("clipboard")}<span>Paste</span>`,title:"Paste an image from the clipboard (Ctrl+V)",onclick:()=>e.pasteFromClipboard()})),F=e.savedWorkspace&&e.savedWorkspace(),G=F?m("div.itp-group.itp-saved",{},m("span",{text:`Saved in this browser: ${F.count} file${F.count===1?"":"s"}`,title:"Kept in this browser's storage, never uploaded. Clearing the site's data also removes it."}),m("button.itp-link",{type:"button",text:"Forget",title:"Remove the saved files from this browser",onclick:()=>e.forgetWorkspace()})):null;At(d,O,I,D,G,m("div.itp-group",{},m("span",{text:"Drop images or videos anywhere in the window. Files share one set of settings unless you give one its own (\u22EF menu or right-click). Save keeps them in this browser for next time."})))}let v=new Map,k=0;function x(){let P=e.store.settings,I=yn.filter(T=>!p()||(T.name+T.description).toLowerCase().includes(p())),H=m("div.itp-presets",{});for(let T of I){let O=e.activePreset===T.id,D=v.get(T.id)||m("div.ph",{}),F=m("button.itp-preset",{type:"button","aria-pressed":String(O),title:T.description,onclick:()=>e.applyPreset(T)},D,m("span.t",{text:T.name}),m("span.d",{text:T.description}));H.append(F)}At(d,m("div.itp-group",{},m("span",{text:"Presets replace the current settings. Undo with Ctrl+Z."})),H)}async function w(){let P=++k,I=e.current;if(!(!I||!e.engine))for(let H of yn){if(P!==k)return;let T=Ht(Dt(),H.settings);T.size={...T.size,mode:"width",width:Math.min(T.size.width,72),height:0};try{let O=await e.engine.process(I.source,T);if(P!==k)return;let D=O.toCanvas(1);v.set(H.id,D),t==="presets"&&x()}catch{}}}function y(P,I,H){let T=m("div.itp-strip",{},...P.colors.slice(0,64).map(F=>m("i",{style:{background:F.startsWith("#")?F:"#"+F}}))),O=m("li.itp-pal",{tabindex:"0",role:"button","aria-pressed":String(I)},m("div.row",{},m("span",{text:P.name}),m("span.n",{text:String(P.colors.length),title:P.author?`by ${P.author}`:null})),T),D=()=>e.usePalette(P);if(O.addEventListener("click",D),O.addEventListener("keydown",F=>{(F.key==="Enter"||F.key===" ")&&(F.preventDefault(),D()),H&&F.key==="Delete"&&e.deletePalette(P)}),H){let F=m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Delete ${P.name}`,title:"Delete",html:ie("trash"),onclick:G=>{G.stopPropagation(),e.deletePalette(P)}});O.firstChild.append(F)}return O}function A(){let P=e.store.settings.palette,I=F=>!p()||(F.name+" "+(F.author||"")).toLowerCase().includes(p())||String(F.colors.length)===p(),H=e.userPalettes.filter(I),T=pn.filter(I),O=m("div",{style:{padding:"0 12px 4px",display:"flex",gap:"6px",flexWrap:"wrap"}},m("button.itp-btn.outline.small",{type:"button",html:`${ie("upload")}<span>Import file</span>`,onclick:()=>e.importPalette()}),m("button.itp-btn.small",{type:"button",html:`${ie("palette")}<span>From Lospec</span>`,onclick:()=>e.lospecDialog()})),D=H.length?[m("div.itp-group",{},m("span",{text:"Your palettes"}),m("span.itp-badge",{text:String(H.length)})),m("ul.itp-pal-list",{},...H.map(F=>y(F,P.source==="custom"&&P.name===F.name,!0)))]:[];At(d,O,...D,m("div.itp-group",{},m("span",{text:"Built-in"}),m("span.itp-badge",{text:String(T.length)})),m("ul.itp-pal-list",{},...T.map(F=>y({...F,colors:F.colors.map(G=>"#"+G)},P.source==="builtin"&&P.id===F.id,!1))))}function _(){a.textContent=e.items.length?String(e.items.length):"",t==="files"?M():t==="presets"?x():A()}return{el:h,refresh:_,setTab:f,focusFile(P){t==="files"&&d.querySelectorAll(".itp-file-row")[e.items.indexOf(P)]?.focus()},sourceChanged(){v.clear(),k++,t==="presets"&&(_(),w())},get tab(){return t}}}function Tn(e=0){let t=Math.floor(e/60),n=e-t*60;return`${t}:${n.toFixed(1).padStart(4,"0")}`}un();var Ji=(e,t,n)=>Math.max(t,Math.min(n,e));function Cc(e,{left:t,width:n},o,i){let r=Math.min(7,n/2),a=Ji((e-t-r)/Math.max(1,n-r*2),0,1),c=Math.max(1,Math.ceil(o*i-1e-6)),l=Math.min(c-1,Math.floor(a*o*i));return{index:l,time:l/i,seekTime:Math.max(0,Math.min((l+.5)/i,o-1e-4))}}function Tc(e){let t=Math.max(0,Math.round(e*100)),n=Math.floor(t/36e4),o=Math.floor(t/6e3)%60,i=String(Math.floor(t/100)%60).padStart(2,"0");return`${n?`${n}:${String(o).padStart(2,"0")}`:o}:${i}.${String(t%100).padStart(2,"0")}`}function Qi(e){let t=m("canvas",{hidden:!0,"aria-label":"Frame at hovered time"}),n=m("span",{text:"Loading frame..."}),o=m("span.num.itp-timeline-time"),i=m("div.itp-timeline-preview",{id:Qt("itp-timeline"),role:"tooltip",hidden:!0},m("div.itp-timeline-image",{},t,n),o),r=null,a=null,c=null,l=null;function s(w){w.video.pause(),w.video.removeAttribute("src"),w.video.load(),w.cache.clear()}function d(){a&&(a.disposed=!0,a.running||s(a),a=null)}function h(){i.hidden=!0,r=null,clearTimeout(c),clearTimeout(l),l=setTimeout(d,1e4)}function f(){h(),clearTimeout(l),d()}function p(w,y){let A=i.parentElement.getBoundingClientRect(),_=w.getBoundingClientRect(),P=Math.min(180,Math.max(1,A.width-16));i.style.width=`${P}px`,i.style.left=`${Ji(y-A.left-P/2,8,Math.max(8,A.width-P-8))}px`,i.style.bottom=`${A.bottom-_.top+10}px`}function b(w){t.width=w.width,t.height=w.height;let y=t.getContext("2d");y.imageSmoothingEnabled=!1,y.drawImage(w,0,0),t.hidden=!1,n.hidden=!0}function M(w){let y=Math.min(1,168/w.width,104/w.height),A=m("canvas",{width:Math.max(1,Math.round(w.width*y)),height:Math.max(1,Math.round(w.height*y))}),_=A.getContext("2d");return _.imageSmoothingEnabled=!1,_.drawImage(w,0,0,A.width,A.height),A}async function v(w){if(!(w.running||w.failed)){w.running=!0;try{for(await w.ready;!w.disposed&&r?.item===w.item;){let y=r,A=w.cache.get(y.key);if(!A){if(await zt(w.video,y.seekTime),w.disposed)break;if(r?.key!==y.key)continue;let _=await e.engine.process(w.video,y.settings);if(w.disposed)break;A=M(_.toCanvas(1)),w.cache.set(y.key,A),w.cache.size>32&&w.cache.delete(w.cache.keys().next().value)}if(r?.key===y.key&&e.current===w.item){b(A);break}}}catch{w.disposed||(w.failed=!0,r?.item===w.item&&(t.hidden=!0,n.hidden=!1,n.textContent="Preview unavailable"))}finally{w.running=!1,w.disposed&&s(w)}}}function k(){if(!(!r||!e.engine)){if(a?.item!==r.item){d();let w=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});w.muted=!0,w.src=r.item.source.currentSrc||r.item.source.src,a={item:r.item,video:w,cache:new Map,running:!1,disposed:!1,failed:!1,ready:Vt(w,{timeout:1e4})}}v(a)}}function x(w,{getFrame:y}={}){w.setAttribute("aria-describedby",i.id),w.addEventListener("pointermove",A=>{let _=e.current;if(A.pointerType==="touch"||_?.type!=="video"||!Number.isFinite(_.duration)||_.duration<=0){h();return}clearTimeout(l);let P=_.fps||30,I=Cc(A.clientX,w.getBoundingClientRect(),_.duration,P),{export:H,...T}=e.store.settings,O=`${P}/${I.index}/${JSON.stringify(T)}`,D=r;r={item:_,key:O,...I,settings:e.store.settings},p(w,A.clientX),i.hidden=!1,o.textContent=Tc(I.time);let F=y?.(I.index)||a?.item===_&&a.cache.get(O);if(F){clearTimeout(c),b(F);return}D?.item===_&&D.key===O||(t.hidden=!0,n.hidden=!1,n.textContent=a?.failed?"Preview unavailable":"Loading frame...",clearTimeout(c),c=setTimeout(k,80))}),w.addEventListener("pointerleave",h),w.addEventListener("pointercancel",h),w.addEventListener("blur",h)}return window.addEventListener("resize",h),{el:i,bind:x,hide:h,reset:f}}var Ac=`<svg xmlns="http://www.w3.org/2000/svg" width="960" height="640" viewBox="0 0 960 640">
306
306
  <defs>
307
307
  <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#1d1a3f"/><stop offset=".45" stop-color="#6b3f7c"/><stop offset=".72" stop-color="#e0766a"/><stop offset=".86" stop-color="#f6c27a"/></linearGradient>
308
308
  <radialGradient id="sun" cx=".5" cy=".5" r=".5"><stop offset="0" stop-color="#fff4d6"/><stop offset=".35" stop-color="#ffd98a"/><stop offset=".6" stop-color="#ffb46a" stop-opacity=".55"/><stop offset="1" stop-color="#ff9a6a" stop-opacity="0"/></radialGradient>
@@ -324,7 +324,7 @@ void main() {
324
324
  <path d="M0 470 L140 430 L260 455 L380 425 L520 462 L660 432 L800 458 L960 436 V480 H0Z" fill="#120d22" opacity=".9"/>
325
325
  <path d="M60 640 C120 560 180 560 240 640Z" fill="#0d0a1a"/><path d="M780 640 C840 575 900 560 960 600 V640Z" fill="#0d0a1a"/>
326
326
  <g fill="none" stroke="#2a1b38" stroke-width="3" stroke-linecap="round"><path d="M300 170 q10 -10 20 0 q10 -10 20 0"/><path d="M350 200 q7 -7 14 0 q7 -7 14 0"/><path d="M262 210 q6 -6 12 0 q6 -6 12 0"/></g>
327
- </svg>`,oc=`<svg xmlns="http://www.w3.org/2000/svg" width="900" height="680" viewBox="0 0 900 680">
327
+ </svg>`,_c=`<svg xmlns="http://www.w3.org/2000/svg" width="900" height="680" viewBox="0 0 900 680">
328
328
  <defs>
329
329
  <linearGradient id="wall" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#2f3b45"/><stop offset="1" stop-color="#1a2129"/></linearGradient>
330
330
  <linearGradient id="table" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#9a6a45"/><stop offset="1" stop-color="#4c2f1f"/></linearGradient>
@@ -354,7 +354,7 @@ void main() {
354
354
  <ellipse cx="690" cy="530" rx="80" ry="56" fill="url(#lemon)"/>
355
355
  <circle cx="370" cy="560" r="44" fill="url(#plum)"/>
356
356
  <circle cx="780" cy="585" r="34" fill="url(#plum)"/>
357
- </svg>`,rc=`<svg xmlns="http://www.w3.org/2000/svg" width="560" height="560" viewBox="0 0 560 560">
357
+ </svg>`,Lc=`<svg xmlns="http://www.w3.org/2000/svg" width="560" height="560" viewBox="0 0 560 560">
358
358
  <defs>
359
359
  <radialGradient id="glass" cx=".38" cy=".35" r=".7"><stop offset="0" stop-color="#e8fbff" stop-opacity=".9"/><stop offset=".5" stop-color="#9fd8f0" stop-opacity=".55"/><stop offset="1" stop-color="#3a6f9e" stop-opacity=".85"/></radialGradient>
360
360
  <linearGradient id="liquid" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#ff7ad1"/><stop offset=".6" stop-color="#b8248f"/><stop offset="1" stop-color="#5d0e4c"/></linearGradient>
@@ -368,7 +368,7 @@ void main() {
368
368
  <path d="M160 300 C180 262 214 240 250 228" stroke="#ffffff" stroke-width="16" stroke-linecap="round" fill="none" opacity=".75"/>
369
369
  <path d="M150 340 v12" stroke="#ffffff" stroke-width="16" stroke-linecap="round" opacity=".6"/>
370
370
  <path d="M240 156 V210 C150 240 104 310 104 380 C104 470 182 520 280 520 C378 520 456 470 456 380 C456 310 410 240 320 210 V156Z" fill="none" stroke="#1d3150" stroke-width="10"/>
371
- </svg>`,Wn=[{id:"dusk",name:"Dusk",svg:nc},{id:"still-life",name:"Still life",svg:oc},{id:"potion",name:"Potion (transparent)",svg:rc}],Oo=e=>"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(e.svg);async function Oi(e){let t=new Image;return t.src=Oo(e),await t.decode(),t}var ic="image-to-pixel",qn="workspace",Do="current";function ac(){return new Promise((e,t)=>{if(typeof indexedDB>"u"){t(new Error("This browser has no IndexedDB"));return}let n=indexedDB.open(ic,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(qn)||n.result.createObjectStore(qn)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function Fo(e,t){let n=await ac();try{return await new Promise((o,i)=>{let r=n.transaction(qn,e),a=t(r.objectStore(qn));r.oncomplete=()=>o(a&&a.result),r.onerror=()=>i(r.error||a&&a.error),r.onabort=()=>i(r.error||new Error("Saving was cancelled"))})}finally{n.close()}}async function Di(e){let t={version:1,savedAt:Date.now(),...e};return await Fo("readwrite",n=>n.put(t,Do)),e.items.reduce((n,o)=>n+(o.file?o.file.size:0),0)}async function Fi(){try{let e=await Fo("readonly",t=>t.get(Do));return e&&e.version===1&&Array.isArray(e.items)?e:null}catch{return null}}async function $i(){await Fo("readwrite",e=>e.delete(Do))}var zi=e=>!!e&&(e.name==="QuotaExceededError"||/quota|space/i.test(e.message||"")),$o=e=>e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(1)} MB`:`${Math.max(1,Math.round(e/1e3))} KB`;var Bi=/^image\//,Ni=/^video\//,sc=/\.(gpl|hex|pal|txt|json)$/i;async function Pu(e,t={}){let n=t.persist!==!1,o=()=>matchMedia("(max-width: 900px)").matches,i=t.settings||n&&pt("settings",null)||Et();if(/[#&]s=/.test(location.hash))try{i=Qn(location.hash)}catch{Z("That share link could not be read; using your last settings",{kind:"error"})}let r=ci(i),a={store:r,engine:null,items:[],current:null,result:null,exporting:!1,activePreset:null,userPalettes:n?pt("palettes",[]):[],shared:r.settings,clipboard:null,videoSupport:{mp4:!1,webm:!1},toast:(d,g)=>Z(d,g)},c=ui({onPick:Bt,onViewChange:()=>Ft()}),u=Ui(a),s=Ii(a),l=Pi(a),p=(d,g,k,A={})=>m("button.itp-btn.icon",{type:"button","aria-label":g,title:g,html:Q(d),onclick:k,...A}),f=m("span.name",{text:"No image"});f.addEventListener("click",()=>{a.current&&je(a.current)});let h=m("span.meta.num",{}),y=p("undo","Undo (Ctrl+Z)",()=>r.undo()),E=p("redo","Redo (Ctrl+Shift+Z)",()=>r.redo()),v=p("compare","Compare with original (C)",()=>bt(),{"aria-pressed":"false"}),M=p("grid","Pixel grid (G)",()=>Kt(),{"aria-pressed":"false"}),x=m("button.itp-btn.itp-zoom.num",{type:"button","aria-label":"Zoom","aria-haspopup":"menu",html:`<span>Fit</span>${Q("chevronDown")}`,onclick:d=>yt(d.currentTarget)}),S=p("moon","Toggle theme (T)",()=>Zt()),b=p("sidebarLeft","Toggle library (\\)",()=>Re("lib")),_=p("sidebarRight","Toggle inspector (/)",()=>Re("insp")),L=p("keyboard","Keyboard shortcuts (?)",()=>ae()),P=m("button.itp-btn.primary",{type:"button","aria-haspopup":"menu",html:`${Q("download")}<span>Export</span>`,onclick:d=>H(d.currentTarget)}),R=m("button.itp-btn.outline",{type:"button",title:"Save these files and their settings in this browser",html:`${Q("save")}<span class="hide-sm">Save</span>`,onclick:()=>$e()});R.hidden=!n;let j=m("a.itp-brand",{href:t.homeHref||"#",title:"Image-to-Pixel"},m("span.itp-mark",{"aria-hidden":"true"},...Array.from({length:9},()=>m("i"))),m("span.hide-sm",{text:"Image-to-Pixel"}));t.homeHref||j.addEventListener("click",d=>d.preventDefault());let C=m("header.itp-top",{},b,j,m("span.sep.hide-sm"),m("div.itp-file",{},f,h),m("div.spacer"),m("span.hide-sm.contents",{},y,E,m("span.sep")),v,M,x,m("span.sep.hide-sm"),m("span.hide-sm.contents",{},S,L),_,m("span",{style:{width:"6px"}}),R,P),D=t.samples===!1?null:m("div.samples",{},...Wn.map(d=>m("button",{type:"button",title:`Try "${d.name}"`,"aria-label":`Open sample: ${d.name}`,onclick:()=>tt(d)},m("img",{src:Oo(d),alt:""})))),F=m("div.itp-empty",{},m("div.itp-drop",{},m("h2",{text:"Drop an image or a video"}),m("p",{text:"PNG, JPG, WebP, GIF, SVG, MP4 or WebM. Add several files to process them as a batch. You can also paste with Ctrl+V."}),m("div.actions",{},m("button.itp-btn.primary",{type:"button",html:`${Q("upload")}<span>Choose files</span>`,onclick:()=>mt()}),m("button.itp-btn.outline",{type:"button",html:`${Q("clipboard")}<span>Paste</span>`,onclick:()=>St()})),D?m("p",{style:{fontSize:"var(--fs-xs)",color:"var(--faint)"},text:"Or start from a sample"}):null,D)),I=m("div.itp-float.bl",{"aria-live":"polite"}),N=m("div.itp-busy.itp-float",{hidden:!0,style:{padding:"6px 10px",alignItems:"center",gap:"8px",fontSize:"var(--fs-xs)",color:"var(--muted)",display:"flex"}},m("span.itp-spinner"),m("span",{text:"Rendering"})),z=m("div.itp-float.br",{},p("zoomOut","Zoom out (-)",()=>c.zoomOut()),p("fit","Fit to view (F)",()=>c.fit()),p("zoomIn","Zoom in (+)",()=>c.zoomIn()));c.el.append(F,I,N,z);let se=p("play","Play (Space)",()=>it()),de=m("span.itp-time",{}),oe=m("input.itp-scrub",{type:"range",min:0,max:1e3,value:0,"aria-label":"Video position"}),ee=m("span.muted.num",{style:{fontSize:"var(--fs-xs)",whiteSpace:"nowrap"}}),te={muted:pt("muted",!0)!==!1,volume:Number(pt("volume",1))};te.volume>=0&&te.volume<=1||(te.volume=1);let we=p("volumeOff","Volume (M mutes)",()=>ge(),{"aria-haspopup":"true","aria-expanded":"false"}),ue=m("div.fill"),W=m("div.thumb"),Y=m("div.itp-vslider",{role:"slider",tabindex:"0","aria-label":"Volume","aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},m("div.track",{},ue,W)),be=m("span.num",{}),ce=m("div.itp-volpop",{hidden:!0},be,Y),le=m("div.itp-sound",{hidden:!0},ce,we),me=d=>Pt(d<=.005?{muted:!0}:{muted:!1,volume:Math.min(1,d)}),pe=d=>{let g=Y.querySelector(".track").getBoundingClientRect();return Math.max(0,Math.min(1,(g.bottom-d.clientY)/g.height))};Y.addEventListener("pointerdown",d=>{d.preventDefault(),Y.focus(),Y.setPointerCapture(d.pointerId);let g=te.muted?0:te.volume;me(pe(d));let k=U=>me(pe(U)),A=()=>{Y.removeEventListener("pointermove",k),Y.removeEventListener("pointerup",A),Y.removeEventListener("pointercancel",A),te.muted&&g>0&&Pt({muted:!0,volume:g})};Y.addEventListener("pointermove",k),Y.addEventListener("pointerup",A),Y.addEventListener("pointercancel",A)}),Y.addEventListener("keydown",d=>{let g=te.muted?0:te.volume,k={ArrowUp:g+.05,ArrowRight:g+.05,ArrowDown:g-.05,ArrowLeft:g-.05,PageUp:g+.2,PageDown:g-.2,Home:0,End:1}[d.key];if(k===void 0){d.key==="Escape"&&(d.preventDefault(),ge(!1),we.focus());return}d.preventDefault(),d.stopPropagation(),me(k)}),Y.addEventListener("wheel",d=>{d.preventDefault(),me((te.muted?0:te.volume)-Math.sign(d.deltaY)*.05)},{passive:!1});function ge(d=ce.hidden){if(ce.hidden=!d,we.setAttribute("aria-expanded",String(d)),d){let g=k=>{le.contains(k.target)||(ge(!1),document.removeEventListener("pointerdown",g,!0))};document.addEventListener("pointerdown",g,!0)}}let xe=m("div.itp-transport",{role:"group","aria-label":"Video"},p("stepBack","Previous frame (,)",()=>Je(-1)),se,p("stepForward","Next frame (.)",()=>Je(1)),de,oe,le,ee),ke=m("main.itp-stage",{"data-video":"false"},c.el,xe);ke.addEventListener("pointerdown",()=>{o()&&ie.dataset.lib==="open"&&Re("lib")},!0);let ie=m("div.itp.itp-app",{"data-lib":o()?"closed":pt("lib","open"),"data-insp":pt("insp","open")},C,s.el,ke,u.el);st(e,ie),zt(pt("theme",null)),I.textContent="Starting\u2026";try{a.engine=await Yr()}catch(d){throw Z(`Could not start: ${d.message}`,{kind:"error"}),d}u.el.querySelector("#itp-backend").textContent=a.engine.backend==="webgl"?"GPU \xB7 ShaderMate":"CPU",u.el.querySelector("#itp-backend").title=a.engine.backend==="webgl"?`WebGL 2: ${a.engine.renderer}`:a.engine.fallbackReason||"CPU renderer",Promise.resolve().then(()=>(Uo(),Ro)).then(d=>d.videoSupport()).then(d=>{a.videoSupport=d}).catch(()=>{});let ze=!1,Be=!1,lt=null,qe=document.createElement("canvas");function Ne(){ze=!0,Be||requestAnimationFrame(Ct)}a.schedule=Ne;async function Ct(){if(Be||!ze||a.exporting)return;ze=!1;let d=a.current;if(!d){a.result=null,c.clear(),De();return}Be=!0;let g=setTimeout(()=>{N.hidden=!1},250);try{d.type==="video"&&a.engine.invalidate();let k=await a.engine.process(d.source,r.settings);if(d!==a.current)return;a.result=k,k.toCanvas(1,{canvas:qe}),c.show(qe,d.source,k.crop),u.setStats(k),u.sync(r.settings,k),lt!==d&&(lt=d),De()}catch(k){console.error(k),Z(`Rendering failed: ${k.message}`,{kind:"error"})}finally{clearTimeout(g),N.hidden=!0,Be=!1,ze&&requestAnimationFrame(Ct)}}function De(){let d=a.result,g=a.current;if(f.textContent=g?g.name:"No image",h.textContent=g?g.type==="video"?`${g.width} \xD7 ${g.height}, ${yn(g.duration)}`:`${g.width} \xD7 ${g.height}`:"",F.hidden=!!g,z.hidden=!g,!g||!d){I.hidden=!0;return}I.hidden=!1,st(I,m("span",{},m("b",{text:`${d.width} \xD7 ${d.height}`})," px"),m("span",{text:`${Math.round(c.zoom*100)/100}\xD7 zoom`})),y.disabled=!r.canUndo,E.disabled=!r.canRedo}function Ft(){x.querySelector("span").textContent=!a.current||c.fitted?"Fit":c.zoom>=1?`${Math.round(c.zoom*10)/10}\xD7`:`${Math.round(c.zoom*100)}%`,a.result&&De()}r.subscribe((d,g)=>{let k=a.current;k&&k.own&&r.target===k.id?k.own=d:r.target==="shared"&&(a.shared=d),u.sync(d,a.result),y.disabled=!r.canUndo,E.disabled=!r.canRedo,g!=="preset"&&(a.activePreset=null),n&&Me(),s.tab==="palettes"&&s.refresh(),Ne()});let et=null,Me=()=>{clearTimeout(et),et=setTimeout(()=>ct("settings",a.shared),300)};async function Ye(d,g,k){let A=document.createElement("canvas"),U=72/Math.max(g,k);A.width=Math.max(1,Math.round(g*U)),A.height=Math.max(1,Math.round(k*U));try{A.getContext("2d").drawImage(d,0,0,A.width,A.height)}catch{}return A.toDataURL()}async function Ae(d,g,k=null){let A=g.naturalWidth||g.width,U=g.naturalHeight||g.height,B={id:crypto.randomUUID?.()||String(Math.random()),name:d,type:"image",source:g,width:A,height:U,file:k};return B.thumb=await Ye(g,A,U),a.items.push(B),B}async function ht(d,g){let k=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});k.muted=!0,k.src=URL.createObjectURL(g);try{await nn(k)}catch(U){if(URL.revokeObjectURL(k.src),U.code===3||U.code===4){let B=await ri(g).catch(()=>""),X=B==="H.264"?"WebM (VP9)":B==="VP9"?"H.264 MP4":"H.264 MP4 or WebM (VP9)",re=new Error(B?`it's ${B}, which this browser can't play. Re-save it as ${X}, or open the editor in a browser that plays ${B}.`:`this browser can't play this video's format. Re-save it as ${X}.`);throw re.code=U.code,re}throw U}let A={id:crypto.randomUUID?.()||String(Math.random()),name:d,type:"video",source:k,width:k.videoWidth,height:k.videoHeight,duration:k.duration,fps:30,file:g};return await Xt(k,Math.min(.05,k.duration/2)).catch(()=>{}),A.thumb=await Ye(k,A.width,A.height),a.items.push(A),A.fpsReady=On(k,30).catch(()=>30).then(U=>{A.fps=U,A.fpsReady=null,a.current===A&&He(),u.syncAnim()}),ii(g).then(U=>{A.hasAudio=U,a.current===A&&He()}),k.addEventListener("timeupdate",()=>{a.current===A&&He()}),k.addEventListener("play",()=>{a.current===A&&(He(),$t(A))}),k.addEventListener("pause",()=>{a.current===A&&(He(),Ne())}),k.addEventListener("seeked",()=>{a.current===A&&!a.exporting&&Ne()}),k.addEventListener("ended",()=>{a.current!==A||a.exporting||A.fpsReady||(k.currentTime=0,k.play().catch(()=>{}))}),A}async function Fe(d){let g=[],k=[],A=[];for(let X of d)sc.test(X.name)&&!/^image|^video/.test(X.type)?/\.json$/i.test(X.name)?A.push(X):k.push(X):(Bi.test(X.type)||Ni.test(X.type)||/\.(png|jpe?g|gif|webp|bmp|svg|avif|mp4|webm|mov)$/i.test(X.name))&&g.push(X);for(let X of k)await K(X);for(let X of A){let re=await X.text();try{let fe=JSON.parse(re);fe.colors||Array.isArray(fe)?await K(X,re):(r.replace(eo(fe)),Z(`Loaded settings from ${X.name}`,{kind:"ok"}))}catch(fe){Z(`${X.name}: ${fe.message}`,{kind:"error"})}}let U=null,B=g.length>2?Z(`Loading ${g.length} files`,{progress:!0}):null;for(let X=0;X<g.length;X++){let re=g[X];try{let fe;if(Ni.test(re.type)||/\.(mp4|webm|mov)$/i.test(re.name))fe=await ht(re.name,re);else{let _e;try{_e=await createImageBitmap(re)}catch{_e=new Image,_e.src=URL.createObjectURL(re),await _e.decode()}fe=await Ae(re.name,_e,re)}U||(U=fe)}catch(fe){Z(`${re.name} could not be opened: ${fe.message}`,{kind:"error"})}B?.progress((X+1)/g.length)}B?.close(),U&&Ce(U),s.refresh(),g.length>1&&Z(`Added ${g.length} files. They share one set of settings.`,{kind:"ok"})}a.addFiles=Fe;async function mt(){let d=await $n({accept:"image/*,video/*,.gpl,.hex,.pal,.txt,.json",multiple:!0});d.length&&Fe(d)}a.openFiles=mt;async function tt(d){let g=await Oi(d),k=await Ae(`${d.name}.svg`,g,new File([d.svg],`${d.name}.svg`,{type:"image/svg+xml"}));Ce(k),s.refresh()}async function St(){try{let d=await navigator.clipboard.read(),g=[];for(let k of d)for(let A of k.types)if(Bi.test(A)){let U=await k.getType(A);g.push(new File([U],`pasted-${new Date().toISOString().slice(11,19).replace(/:/g,"")}.${A.split("/")[1]}`,{type:A}))}g.length?Fe(g):Z("The clipboard has no image",{kind:"error"})}catch{Z("Press Ctrl+V (\u2318V) to paste. The browser blocked direct clipboard access.")}}a.pasteFromClipboard=St;function Ce(d){a.current&&a.current.type==="video"&&a.current!==d&&a.current.source.pause(),a.current=d,ot(d),ke.dataset.video=String(d&&d.type==="video"),d&&d.type==="video"&&He(),c.clear(),a.result=null,c.picking&&O(),s.refresh(),s.sourceChanged(),Ne(),De()}a.select=Ce;function Tt(d){let g=a.items.indexOf(d);g<0||(a.items.splice(g,1),r.dropTarget(d.id),d.type==="video"&&(d.source.pause(),URL.revokeObjectURL(d.source.src)),d.source.close&&!a.items.some(k=>k.source===d.source)&&d.source.close(),a.current===d&&Ce(a.items[Math.min(g,a.items.length-1)]||null),s.refresh(),u.sync(r.settings,a.result))}a.removeItem=Tt,a.clearItems=()=>{for(let d of a.items.slice())Tt(d)};let nt=d=>d===a.current?r.settings:d&&d.own||a.shared;a.settingsFor=nt;let Ke=d=>JSON.parse(JSON.stringify(d));function ot(d,g=!1){let k=d&&d.own?d.id:"shared";r.target===k&&!g||r.setTarget(k,k==="shared"?a.shared:d.own)}function gt(d,g,{quiet:k=!1}={}){if(!(!d||!!d.own===g)){if(g)d.own=Ke(nt(d)),d===a.current&&ot(d),k||Z(`${d.name} now has its own settings. Changes no longer affect other files.`);else{let A=d.own;d.own=null,r.dropTarget(d.id),d===a.current&&ot(d),k||Z(`${d.name} uses the shared settings again`,{action:{label:"Undo",onClick:()=>{d.own=A,d===a.current&&ot(d),ut()}}})}ut()}}function ut(){s.refresh(),u.sync(r.settings,a.result),a.result&&u.setStats(a.result),Ne()}a.setOwn=gt,a.copySettings=d=>{a.clipboard=Ke(nt(d)),Z(`Copied the settings of ${d.name}`,{timeout:1800}),s.refresh()},a.pasteSettings=d=>{a.clipboard&&(d.own||gt(d,!0,{quiet:!0}),d===a.current?r.replace(a.clipboard,"paste"):d.own=Ke(a.clipboard),Z(`Pasted settings onto ${d.name}`,{kind:"ok",timeout:1800}),ut())},a.applyToAll=d=>{let g={shared:a.shared,own:new Map(a.items.map(k=>[k,k.own]))};a.shared=Ke(nt(d));for(let k of a.items)k.own&&r.dropTarget(k.id),k.own=null;r.setTarget("shared",a.shared),n&&Me(),Z(`Every file now uses the settings of ${d.name}`,{action:{label:"Undo",onClick:()=>{a.shared=g.shared;for(let[k,A]of g.own)k.own=A;ot(a.current,!0),ut()}}}),ut()},a.duplicate=async d=>{let g;d.type==="video"?g=await ht(Ge(d.name),d.file):g=await Ae(Ge(d.name),d.source,d.file),a.items.splice(a.items.indexOf(g),1),a.items.splice(a.items.indexOf(d)+1,0,g),g.own=Ke(nt(d)),Ce(g),Z(`Duplicated ${d.name}. The copy has its own settings.`,{timeout:2400})};let Ge=d=>{let g=/^(.*?)(\.[^.]*)?$/.exec(d);return`${g[1]} copy${g[2]||""}`};a.move=(d,g)=>{let k=a.items.indexOf(d),A=k+g;k<0||A<0||A>=a.items.length||([a.items[k],a.items[A]]=[a.items[A],a.items[k]],s.refresh(),(document.activeElement===document.body||document.activeElement?.closest?.(".itp-files"))&&s.focusFile(d))};let dt=d=>{let g=/^(.*?)(\.[^.\s]{1,5})?$/.exec(d);return[g[1],g[2]||""]};a.rename=(d,g)=>{let[,k]=dt(d.name),A=String(g||"").trim().replace(/[\\/:*?"<>|]+/g,"-");k&&A.toLowerCase().endsWith(k.toLowerCase())&&(A=A.slice(0,-k.length)),!(!A||A+k===d.name)&&(d.name=A+k,s.refresh(),De())};function je(d){if(!d||f.hidden)return;a.current!==d&&Ce(d);let[g]=dt(d.name),k=m("input.itp-name-input",{type:"text",value:d.name,"aria-label":"File name",spellcheck:!1});k.style.width=`${Math.min(40,Math.max(12,d.name.length+2))}ch`,f.hidden=!0,f.after(k),k.focus(),k.setSelectionRange(0,g.length);let A=!1,U=B=>{A||(A=!0,B&&a.rename(d,k.value),k.remove(),f.hidden=!1)};k.addEventListener("keydown",B=>{B.stopPropagation(),B.key==="Enter"&&(B.preventDefault(),U(!0)),B.key==="Escape"&&(B.preventDefault(),U(!1))}),k.addEventListener("blur",()=>U(!0))}a.startRename=je;let Le=null;a.savedWorkspace=()=>Le;async function rt(d){if(d.file)return d.file;let g=document.createElement("canvas");return g.width=d.width,g.height=d.height,g.getContext("2d").drawImage(d.source,0,0),new Promise(k=>g.toBlob(A=>k(A),"image/png"))}async function $e(){if(n){if(!a.items.length){if(Le){await Ze();return}Z("Add files first, then Save keeps them here for next time.");return}R.disabled=!0;try{let d=[];for(let A of a.items)d.push({name:A.name,type:A.type,file:await rt(A),own:A.own?Ke(A.own):null});let g=await Di({shared:Ke(a.shared),current:Math.max(0,a.items.indexOf(a.current)),items:d}),k=!Le;Le={count:d.length,bytes:g,savedAt:Date.now()},s.refresh(),Z(k?`Saved ${d.length} file${d.length===1?"":"s"} (${$o(g)}) in this browser only. They reopen next time; remove them with Forget in the Files list.`:`Saved ${d.length} file${d.length===1?"":"s"} (${$o(g)})`,{kind:"ok",timeout:k?7e3:2200})}catch(d){console.error(d),Z(zi(d)?"Not enough browser storage to save these files. Remove some (videos are large) and try again.":`Couldn't save: ${d.message}`,{kind:"error"})}finally{R.disabled=!1}}}a.saveWorkspace=$e;async function Ze(){try{await $i()}catch(d){Z(`Couldn't remove the saved files: ${d.message}`,{kind:"error"});return}Le=null,s.refresh(),Z("Removed the saved files from this browser. Files open now stay open.")}a.forgetWorkspace=Ze;async function At(){let d=await Fi();if(!d)return;if(Le={count:d.items.length,bytes:d.items.reduce((U,B)=>U+(B.file?B.file.size:0),0),savedAt:d.savedAt},a.items.length||!d.items.length){s.refresh();return}d.shared&&!/[#&]s=/.test(location.hash)&&r.setTarget("shared",d.shared);let g=d.items.length>2?Z(`Opening ${d.items.length} saved files`,{progress:!0}):null,k=[];for(let U=0;U<d.items.length;U++){let B=d.items[U];try{let X=B.file instanceof File?B.file:new File([B.file],B.name,{type:B.file.type}),re;if(B.type==="video")re=await ht(B.name,X);else{let fe;try{fe=await createImageBitmap(X)}catch{fe=new Image,fe.src=URL.createObjectURL(X),await fe.decode()}re=await Ae(B.name,fe,X)}re.own=B.own||null,k.push(re)}catch(X){console.warn("[workspace] skipped",B.name,X)}g?.progress((U+1)/d.items.length)}g?.close();let A=k[Math.min(d.current||0,k.length-1)];A&&Ce(A),s.refresh(),k.length&&Z(`Reopened your saved files (${k.length})`,{timeout:2200})}function He(){let d=a.current;if(!d||d.type!=="video")return;let g=d.source;se.innerHTML=Q(g.paused?"play":"pause"),se.setAttribute("aria-label",g.paused?"Play (Space)":"Pause (Space)");let k=Math.floor(g.currentTime*d.fps+1e-6);de.innerHTML=`${yn(g.currentTime)} <span>/ ${yn(g.duration)}</span>`,de.title=`Frame ${k}`,oe.value=String(Math.round(g.currentTime/(g.duration||1)*1e3)),oe.style.setProperty("--p",`${oe.value/10}%`),ee.textContent=`${d.fps} fps`,le.hidden=d.hasAudio===!1,_t(g)}function _t(d){d&&!a.exporting&&!a.current?.fpsReady&&(d.muted!==te.muted&&(d.muted=te.muted),d.volume!==te.volume&&(d.volume=te.volume));let g=te.muted?0:te.volume,k=Math.round(g*100);we.innerHTML=Q(g?"volume":"volumeOff");let A=g?`Volume ${k}% (M mutes)`:"Muted (M unmutes)";we.setAttribute("aria-label",A),we.title=A,Y.setAttribute("aria-valuenow",String(k)),Y.setAttribute("aria-valuetext",g?`${k}%`:"Muted"),Y.style.setProperty("--v",`${k}%`),be.textContent=g?String(k):"Off"}function Pt(d){Object.assign(te,d),d.muted===!1&&!te.volume&&(te.volume=1),ct("muted",te.muted),ct("volume",te.volume),_t(a.current&&a.current.type==="video"?a.current.source:null)}function $t(d){let g=d.source,k=()=>{g.paused||a.current!==d||(Ne(),"requestVideoFrameCallback"in g?g.requestVideoFrameCallback(k):requestAnimationFrame(k))};k()}async function it(){let d=a.current;if(!(!d||d.type!=="video")){if(!d.source.paused){d.source.pause();return}d.fpsReady&&await d.fpsReady,a.current===d&&(_t(d.source),d.source.ended&&(d.source.currentTime=0),d.source.play().catch(g=>Z(g.message,{kind:"error"})))}}function Je(d){let g=a.current;if(!g||g.type!=="video")return;let k=g.source;k.pause();let A=Math.floor(k.currentTime*g.fps+1e-6)+d;Xt(k,(Math.max(0,A)+.5)/g.fps).then(()=>{He(),Ne()})}oe.addEventListener("input",()=>{let d=a.current;!d||d.type!=="video"||(d.source.currentTime=oe.value/1e3*d.source.duration)});function bt(d){let g=d??!c.compare;c.setCompare(g),v.setAttribute("aria-pressed",String(g))}function Kt(d){let g=d??!c.grid;c.setGrid(g),M.setAttribute("aria-pressed",String(g)),g&&c.zoom<6&&a.result&&Z("The grid shows from 6\xD7 zoom")}function yt(d){hn(d,[{label:"Fit to view",kbd:"F",icon:"fit",onClick:()=>c.fit()},"sep",...[1,2,4,8,16,32].map(g=>({label:`${g}\xD7`,sub:g===1?"One screen pixel per pixel":null,onClick:()=>c.zoomTo(g)})),"sep",{label:"Zoom in",kbd:"+",icon:"zoomIn",onClick:()=>c.zoomIn()},{label:"Zoom out",kbd:"-",icon:"zoomOut",onClick:()=>c.zoomOut()}])}function Re(d){let g=d==="lib"?"lib":"insp",k=ie.dataset[g]!=="open";ie.dataset[g]=k?"open":"closed",(!o()||d==="insp")&&ct(g,ie.dataset[g]),requestAnimationFrame(()=>c.resize())}function zt(d){d?document.documentElement.dataset.theme=d:delete document.documentElement.dataset.theme;let g=d?d==="dark":!matchMedia("(prefers-color-scheme: light)").matches;S.innerHTML=Q(g?"sun":"moon"),S.setAttribute("aria-label",g?"Switch to light theme (T)":"Switch to dark theme (T)"),c.redraw()}function Zt(){let g=(document.documentElement.dataset.theme||(matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"))==="dark"?"light":"dark";ct("theme",g),zt(g)}function ve(d,g=4096){let k=d.width,A=d.height,U=Math.min(1,g/Math.max(k,A)),B=document.createElement("canvas");B.width=Math.round(k*U),B.height=Math.round(A*U);let X=B.getContext("2d",{willReadFrequently:!0});return X.drawImage(d.source,0,0,B.width,B.height),X.getImageData(0,0,B.width,B.height)}function Bt(d,g){let k=a.current;if(!k)return;let A=ve(k,1024),U=a.result?a.result.crop:{x:0,y:0,w:1,h:1},B=Math.min(A.width-1,Math.floor((U.x+d*U.w)*A.width)),re=(Math.min(A.height-1,Math.floor((U.y+g*U.h)*A.height))*A.width+B)*4,fe=Nt([A.data[re],A.data[re+1],A.data[re+2]]),_e=r.settings,Ve=_e.palette.source==="custom"?_e.palette.colors:[];if(Ve.includes(fe))return Z(`${fe} is already in the palette`);r.update({palette:{source:"custom",name:_e.palette.source==="custom"?_e.palette.name:"Picked",colors:[...Ve,fe]}}),Z(`Added ${fe}`,{kind:"ok",timeout:1500})}let T=null;function O(d){d&&(T=d);let g=!c.picking;c.setPicking(g),T?.setAttribute("aria-pressed",String(g)),g&&(bt(!0),Z("Click the image to add colours. Press Esc when done."))}a.togglePicker=O;function $(d){d.id&&!d.custom?r.update({palette:{source:"builtin",id:d.id}}):r.update({palette:{source:"custom",name:d.name,colors:d.colors}})}a.usePalette=$;function V(d,g){let k=a.userPalettes.filter(A=>A.name!==d);k.unshift({name:d,colors:g,custom:!0}),a.userPalettes=k.slice(0,100),n&&ct("palettes",a.userPalettes),s.tab==="palettes"&&s.refresh()}async function K(d,g){try{let k=go(g??await d.text(),d.name);V(k.name||"Imported",k.colors),r.update({palette:{source:"custom",name:k.name||"Imported",colors:k.colors}}),Z(`Imported "${k.name}" (${k.colors.length} colours)`,{kind:"ok"})}catch(k){Z(`${d.name}: ${k.message}`,{kind:"error"})}}a.importPalette=async()=>{let[d]=await $n({accept:".gpl,.hex,.pal,.txt,.json"});d&&K(d)},a.savePalette=()=>{let d=r.settings,g=d.palette.source==="extract"?a.result?.palette||[]:d.palette.colors;if(!g.length)return Z("There is no palette to save",{kind:"error"});let k=m("input.itp-input",{value:d.palette.source==="custom"?d.palette.name:`${d.palette.name} copy`,"aria-label":"Palette name"}),A=m("select.itp-select",{"aria-label":"Also download as"},m("option",{value:"",text:"Don't download"}),m("option",{value:"gpl",text:".gpl (GIMP, Aseprite)"}),m("option",{value:"hex",text:".hex (Lospec)"}),m("option",{value:"json",text:".json"}));mn("Save palette",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Name"})),k),m("div.itp-field",{},m("div.lab",{},m("span",{text:"Also download as"})),A),m("div.itp-strip",{style:{height:"18px"}},...g.map(U=>m("i",{style:{background:U}})))],{actions:[{label:"Cancel"},{label:"Save",primary:!0,onClick:()=>{let U=k.value.trim()||"Palette";V(U,g),r.update({palette:{source:"custom",name:U,colors:g}});let B=U.replace(/[^\w-]+/g,"-").toLowerCase();A.value==="gpl"&&We(Zr(U,g),`${B}.gpl`,"text/plain"),A.value==="hex"&&We(Jr(g),`${B}.hex`,"text/plain"),A.value==="json"&&We(Qr(U,g),`${B}.json`,"application/json"),Z(`Saved "${U}" to Your palettes`,{kind:"ok"})}}]}),k.select()},a.deletePalette=d=>{a.userPalettes=a.userPalettes.filter(g=>g!==d),n&&ct("palettes",a.userPalettes),s.refresh(),Z(`Deleted "${d.name}"`,{action:{label:"Undo",onClick:()=>V(d.name,d.colors)}})},a.lospecDialog=()=>{let d=m("input.itp-input",{placeholder:"e.g. rgbg-36 or a lospec.com palette URL","aria-label":"Lospec slug or URL"}),g=m("div.help",{text:"Looks the palette up on lospec.com. Needs an internet connection."}),k=mn("Palette from Lospec",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Slug or URL"})),d,g)],{actions:[{label:"Cancel"},{label:"Fetch",primary:!0,onClick:async()=>{g.textContent="Fetching\u2026",g.style.color="";try{let A=await ei(d.value);return V(A.name,A.colors),r.update({palette:{source:"custom",name:A.name,colors:A.colors}}),Z(`Loaded "${A.name}" from Lospec`,{kind:"ok"}),!0}catch(A){return g.textContent=A.message,g.style.color="var(--danger)",!1}}}]});d.addEventListener("keydown",A=>{A.key==="Enter"&&k.querySelector("footer .primary").click()}),d.focus()},a.detectGrid=()=>{let d=a.current;if(!d||d.type!=="image")return Z("Open an image first",{kind:"error"});let g=Wr(ve(d));if(g<=1)return Z("No pixel grid found. This image doesn't look upscaled.");r.update({size:{mode:"block",block:g,resample:"nearest"}}),Z(`Found ${g} px blocks: switched to pixel size ${g} with nearest sampling`,{kind:"ok"})},a.settingsJSON=()=>Qt(r.settings),a.copyLink=async()=>{let d=`${location.origin}${location.pathname}#s=${Jn(r.settings)}`;try{await navigator.clipboard.writeText(d),Z("Link copied. It holds the settings, not the image.",{kind:"ok"})}catch{mn("Share link",[m("textarea.itp-input",{rows:3,readOnly:!0,value:d})])}history.replaceState(null,"",`#s=${Jn(r.settings)}`)},a.saveSettingsFile=()=>We(Qt(r.settings),"image-to-pixel-settings.json","application/json"),a.loadSettingsFile=async()=>{let[d]=await $n({accept:".json,application/json"});if(d)try{r.replace(eo(await d.text())),Z(`Loaded ${d.name}`,{kind:"ok"})}catch(g){Z(`${d.name}: ${g.message}`,{kind:"error"})}},a.resetSettings=()=>{r.replace(Et()),Z("Settings reset",{action:{label:"Undo",onClick:()=>r.undo()}})},a.applyPreset=d=>{r.replace(Lt(Et(),{...d.settings,export:r.settings.export}),"preset"),a.activePreset=d.id,s.refresh()},Object.assign(a,l);function H(d){let g=a.current,k=g&&g.type==="video",A=a.items.filter(B=>B.type==="image").length,U=r.settings;hn(d,[{group:"Image"},{label:"PNG",sub:a.result?`${a.result.width*U.export.scale} \xD7 ${a.result.height*U.export.scale}, ${U.export.scale}\xD7 scale`:"Open an image first",icon:"image",kbd:"Ctrl S",disabled:!a.result,onClick:()=>a.exportPNG()},{label:"Copy to clipboard",icon:"copy",disabled:!a.result,onClick:()=>a.copyImage()},{label:a.items.length>1?`All ${a.items.length} files as ZIP`:"All files as ZIP",sub:a.items.length>1?null:"Add two or more files",icon:"zip",disabled:a.items.length<2,onClick:()=>a.exportZip()},{group:"Animation"},{label:k?"GIF from this video":"GIF from all images",icon:"gif",disabled:!k&&A<2,onClick:()=>a.exportAnimation({...J(),format:"gif"})},{label:"More formats\u2026",sub:"WebM, MP4, PNG sequence, sprite sheet",icon:"film",onClick:()=>{u.setTab("export"),ie.dataset.insp!=="open"&&Re("insp")}},{group:"Other"},{label:"Tileset",sub:"16 \xD7 16 tiles, duplicates removed",icon:"tiles",disabled:!a.result,onClick:()=>a.exportTileset({tile:16,flips:!1})},{label:"Copy settings link",icon:"link",onClick:()=>a.copyLink()},{label:"Settings as JSON",icon:"braces",onClick:()=>a.saveSettingsFile()}])}let J=()=>{let d=a.current,g=d&&d.type==="video";return{source:g?"video":"files",fps:g?Math.min(30,Math.round(d.fps||12)):8,start:0,end:g?d.duration:0}};function ae(){mn("Keyboard shortcuts",[m("div.itp-keys",{},...[["Open files","Ctrl O"],["Paste image","Ctrl V"],["Export PNG","Ctrl S"],["Undo","Ctrl Z"],["Redo","Ctrl Shift Z"],["Compare","C"],["Pixel grid","G"],["Fit","F"],["Zoom in / out","+ -"],["Pixel width \xB11","[ ]"],["Pixel width \xB18","Shift [ ]"],["Next / previous dither","D Shift D"],["Play / pause video","Space"],["Mute / unmute video","M"],["Rename file","F2"],["Step one frame",", ."],["Library","\\"],["Inspector","/"],["Theme","T"],["Next / previous file","Alt \u2193 \u2191"],["Move file down / up","Alt Shift \u2193 \u2191"],["This list","?"]].map(([g,k])=>m("div",{},m("span",{text:g}),m("span",{},...k.split(" ").filter(Boolean).map(A=>m("kbd",{text:A}))))))])}let ye=d=>d.target.closest('input, select, textarea, [contenteditable="true"]')&&!(d.target.type==="range"||d.target.type==="checkbox"),w=["none","bayer4","bayer8","bluenoise","cluster4","floyd-steinberg","atkinson","sierra-lite","jarvis"];window.addEventListener("keydown",d=>{if(!ie.isConnected||document.querySelector("dialog[open]"))return;let g=d.ctrlKey||d.metaKey,k=d.key;if(g&&k.toLowerCase()==="z"){if(ye(d))return;d.preventDefault(),d.shiftKey?r.redo():r.undo();return}if(g&&k.toLowerCase()==="y"){if(ye(d))return;d.preventDefault(),r.redo();return}if(g&&k.toLowerCase()==="s"){d.preventDefault(),a.exportPNG();return}if(g&&k.toLowerCase()==="o"){d.preventDefault(),mt();return}if(g||d.altKey&&!["ArrowUp","ArrowDown"].includes(k))return;if(ye(d)){k==="Escape"&&d.target.blur();return}let A=r.settings;switch(k){case"c":case"C":bt();break;case"g":case"G":Kt();break;case"f":case"F":c.fit();break;case"+":case"=":c.zoomIn();break;case"-":case"_":c.zoomOut();break;case"t":case"T":Zt();break;case"\\":Re("lib");break;case"/":Re("insp");break;case"?":ae();break;case"[":case"{":r.update({size:{mode:"width",width:Math.max(8,A.size.width-(d.shiftKey?8:1))}},{key:"kw"});break;case"]":case"}":r.update({size:{mode:"width",width:A.size.width+(d.shiftKey?8:1)}},{key:"kw"});break;case"d":case"D":{let U=w.indexOf(A.dither.method),B=w[(U+(d.shiftKey?-1:1)+w.length)%w.length];r.update({dither:{method:B}}),Z(B==="none"?"No dither":B.replace(/-/g," "),{timeout:900});break}case" ":a.current?.type==="video"&&(d.preventDefault(),it());break;case"F2":a.current&&(d.preventDefault(),je(a.current));break;case"m":case"M":a.current?.type==="video"&&!le.hidden&&(d.preventDefault(),Pt({muted:!te.muted}));break;case",":Je(-1);break;case".":Je(1);break;case"Escape":c.picking?O():Yt();break;case"ArrowDown":case"ArrowUp":if(d.altKey&&d.shiftKey&&a.current){d.preventDefault(),a.move(a.current,k==="ArrowDown"?1:-1);break}if(d.altKey&&a.items.length>1){d.preventDefault();let U=a.items.indexOf(a.current);Ce(a.items[(U+(k==="ArrowDown"?1:-1)+a.items.length)%a.items.length])}break;default:return}});let G=0;return ie.addEventListener("dragenter",d=>{[...d.dataTransfer.types].includes("Files")&&(G++,ie.classList.add("itp-dragging"))}),ie.addEventListener("dragleave",()=>{--G<=0&&(G=0,ie.classList.remove("itp-dragging"))}),ie.addEventListener("dragover",d=>{[...d.dataTransfer.types].includes("Files")&&d.preventDefault()}),ie.addEventListener("drop",d=>{d.preventDefault(),G=0,ie.classList.remove("itp-dragging"),d.dataTransfer.files.length&&Fe([...d.dataTransfer.files])}),window.addEventListener("paste",d=>{if(!ie.isConnected||ye(d))return;let g=[...d.clipboardData?.files||[]];if(g.length){d.preventDefault(),Fe(g);return}let k=d.clipboardData?.getData("text")||"";if(/#?[0-9a-f]{6}/i.test(k)&&/\n|,|\s/.test(k.trim()))try{let A=go(k);r.update({palette:{source:"custom",name:"Pasted",colors:A.colors}}),Z(`Pasted a ${A.colors.length}-colour palette`,{kind:"ok"})}catch{}}),window.addEventListener("hashchange",()=>{if(/[#&]s=/.test(location.hash))try{r.replace(Qn(location.hash))}catch{}}),u.sync(r.settings,null),s.refresh(),De(),y.disabled=E.disabled=!0,n&&t.restore!==!1&&At().catch(d=>console.warn("[workspace]",d)),{app:a,store:r,addFiles:Fe,async addImage(d,g="image"){let k=await Ae(g,d);return Ce(k),s.refresh(),k},openSample:d=>tt(Wn.find(g=>g.id===d)||Wn[0]),applyPreset:d=>{let g=dn.find(k=>k.id===d);g&&a.applyPreset(g)},setTheme:d=>{ct("theme",d),zt(d)},get result(){return a.result},get view(){return c.rect},async idle(){for(let d=0;d<200&&(ze||Be);d++)await new Promise(g=>setTimeout(g,25))}}}export{Wn as SAMPLES,Pu as mountEditor};
371
+ </svg>`,oo=[{id:"dusk",name:"Dusk",svg:Ac},{id:"still-life",name:"Still life",svg:_c},{id:"potion",name:"Potion (transparent)",svg:Lc}],qo=e=>"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(e.svg);async function ea(e){let t=new Image;return t.src=qo(e),await t.decode(),t}var Pc="image-to-pixel",ro="workspace",Yo="current";function Rc(){return new Promise((e,t)=>{if(typeof indexedDB>"u"){t(new Error("This browser has no IndexedDB"));return}let n=indexedDB.open(Pc,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(ro)||n.result.createObjectStore(ro)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function Ko(e,t){let n=await Rc();try{return await new Promise((o,i)=>{let r=n.transaction(ro,e),a=t(r.objectStore(ro));r.oncomplete=()=>o(a&&a.result),r.onerror=()=>i(r.error||a&&a.error),r.onabort=()=>i(r.error||new Error("Saving was cancelled"))})}finally{n.close()}}async function ta(e){let t={version:1,savedAt:Date.now(),...e};return await Ko("readwrite",n=>n.put(t,Yo)),e.items.reduce((n,o)=>n+(o.file?o.file.size:0),0)}async function na(){try{let e=await Ko("readonly",t=>t.get(Yo));return e&&e.version===1&&Array.isArray(e.items)?e:null}catch{return null}}async function oa(){await Ko("readwrite",e=>e.delete(Yo))}var ra=e=>!!e&&(e.name==="QuotaExceededError"||/quota|space/i.test(e.message||"")),Zo=e=>e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(1)} MB`:`${Math.max(1,Math.round(e/1e3))} KB`;var ia=/^image\//,aa=/^video\//,Ic=/\.(gpl|hex|pal|txt|json)$/i;async function pd(e,t={}){let n=t.persist!==!1,o=()=>matchMedia("(max-width: 900px)").matches,i=t.settings||n&&Rt("settings",null)||Dt();if(/[#&]s=/.test(location.hash))try{i=lo(location.hash)}catch{Q("That share link could not be read; using your last settings",{kind:"error"})}let r=Ei(i),a={store:r,engine:null,items:[],current:null,result:null,exporting:!1,activePreset:null,userPalettes:n?Rt("palettes",[]):[],shared:r.settings,clipboard:null,videoSupport:{mp4:!1,webm:!1},toast:(u,g)=>Q(u,g)},c=ki({onPick:re,onViewChange:()=>Et()}),l=Ki(a),s=Zi(a),d=Hi(a),h=(u,g,S,R={})=>m("button.itp-btn.icon",{type:"button","aria-label":g,title:g,html:ie(u),onclick:S,...R}),f=m("span.name",{text:"No image"});f.addEventListener("click",()=>{a.current&&Ne(a.current)});let p=m("span.meta.num",{}),b=h("undo","Undo (Ctrl+Z)",()=>r.undo()),M=h("redo","Redo (Ctrl+Shift+Z)",()=>r.redo()),v=h("compare","Compare with original (C)",()=>he(),{"aria-pressed":"false"}),k=h("grid","Pixel grid (G)",()=>ae(),{"aria-pressed":"false"}),x=m("button.itp-btn.itp-zoom.num",{type:"button","aria-label":"Zoom","aria-haspopup":"menu",html:`<span>Fit</span>${ie("chevronDown")}`,onclick:u=>Le(u.currentTarget)}),w=h("moon","Toggle theme (T)",()=>B()),y=h("sidebarLeft","Toggle library (\\)",()=>C("lib")),A=h("sidebarRight","Toggle inspector (/)",()=>C("insp")),_=h("keyboard","Keyboard shortcuts (?)",()=>E()),P=m("button.itp-btn.primary",{type:"button","aria-haspopup":"menu",html:`${ie("download")}<span>Export</span>`,onclick:u=>we(u.currentTarget)}),I=m("button.itp-btn.outline",{type:"button",title:"Save these files and their settings in this browser",html:`${ie("save")}<span class="hide-sm">Save</span>`,onclick:()=>Ct()});I.hidden=!n;let H=m("a.itp-brand",{href:t.homeHref||"#",title:"Image-to-Pixel"},m("span.itp-mark",{"aria-hidden":"true"},...Array.from({length:9},()=>m("i"))),m("span.hide-sm",{text:"Image-to-Pixel"}));t.homeHref||H.addEventListener("click",u=>u.preventDefault());let T=m("header.itp-top",{},y,H,m("span.sep.hide-sm"),m("div.itp-file",{},f,p),m("div.spacer"),m("span.hide-sm.contents",{},b,M,m("span.sep")),v,k,x,m("span.sep.hide-sm"),m("span.hide-sm.contents",{},w,_),A,m("span",{style:{width:"6px"}}),I,P),O=t.samples===!1?null:m("div.samples",{},...oo.map(u=>m("button",{type:"button",title:`Try "${u.name}"`,"aria-label":`Open sample: ${u.name}`,onclick:()=>kt(u)},m("img",{src:qo(u),alt:""})))),D=m("div.itp-empty",{},m("div.itp-drop",{},m("h2",{text:"Drop an image or a video"}),m("p",{text:"PNG, JPG, WebP, GIF, SVG, MP4 or WebM. Add several files to process them as a batch. You can also paste with Ctrl+V."}),m("div.actions",{},m("button.itp-btn.primary",{type:"button",html:`${ie("upload")}<span>Choose files</span>`,onclick:()=>bt()}),m("button.itp-btn.outline",{type:"button",html:`${ie("clipboard")}<span>Paste</span>`,onclick:()=>yt()})),O?m("p",{style:{fontSize:"var(--fs-xs)",color:"var(--faint)"},text:"Or start from a sample"}):null,O)),F=m("div.itp-float.bl",{"aria-live":"polite"}),G=m("div.itp-busy.itp-float",{hidden:!0,style:{padding:"6px 10px",alignItems:"center",gap:"8px",fontSize:"var(--fs-xs)",color:"var(--muted)",display:"flex"}},m("span.itp-spinner"),m("span",{text:"Rendering"})),N=m("div.itp-float.br",{},h("zoomOut","Zoom out (-)",()=>c.zoomOut()),h("fit","Fit to view (F)",()=>c.fit()),h("zoomIn","Zoom in (+)",()=>c.zoomIn()));c.el.append(D,F,G,N);let ve=h("play","Play (Space)",()=>Y()),ke=m("span.itp-time",{}),fe=m("input.itp-scrub",{type:"range",min:0,max:1e3,value:0,"aria-label":"Video position"}),se=m("span.muted.num",{style:{fontSize:"var(--fs-xs)",whiteSpace:"nowrap"}}),de={muted:Rt("muted",!0)!==!1,volume:Number(Rt("volume",1))};de.volume>=0&&de.volume<=1||(de.volume=1);let ze=h("volumeOff","Volume (M mutes)",()=>pe(),{"aria-haspopup":"true","aria-expanded":"false"}),me=m("div.fill"),W=m("div.thumb"),V=m("div.itp-vslider",{role:"slider",tabindex:"0","aria-label":"Volume","aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},m("div.track",{},me,W)),Ce=m("span.num",{}),xe=m("div.itp-volpop",{hidden:!0},Ce,V),z=m("div.itp-sound",{hidden:!0},xe,ze),ge=u=>L(u<=.005?{muted:!0}:{muted:!1,volume:Math.min(1,u)}),be=u=>{let g=V.querySelector(".track").getBoundingClientRect();return Math.max(0,Math.min(1,(g.bottom-u.clientY)/g.height))};V.addEventListener("pointerdown",u=>{u.preventDefault(),V.focus(),V.setPointerCapture(u.pointerId);let g=de.muted?0:de.volume;ge(be(u));let S=q=>ge(be(q)),R=()=>{V.removeEventListener("pointermove",S),V.removeEventListener("pointerup",R),V.removeEventListener("pointercancel",R),de.muted&&g>0&&L({muted:!0,volume:g})};V.addEventListener("pointermove",S),V.addEventListener("pointerup",R),V.addEventListener("pointercancel",R)}),V.addEventListener("keydown",u=>{let g=de.muted?0:de.volume,S={ArrowUp:g+.05,ArrowRight:g+.05,ArrowDown:g-.05,ArrowLeft:g-.05,PageUp:g+.2,PageDown:g-.2,Home:0,End:1}[u.key];if(S===void 0){u.key==="Escape"&&(u.preventDefault(),pe(!1),ze.focus());return}u.preventDefault(),u.stopPropagation(),ge(S)}),V.addEventListener("wheel",u=>{u.preventDefault(),ge((de.muted?0:de.volume)-Math.sign(u.deltaY)*.05)},{passive:!1});function pe(u=xe.hidden){if(xe.hidden=!u,ze.setAttribute("aria-expanded",String(u)),u){let g=S=>{z.contains(S.target)||(pe(!1),document.removeEventListener("pointerdown",g,!0))};document.addEventListener("pointerdown",g,!0)}}let Se=m("div.itp-transport",{role:"group","aria-label":"Video"},h("stepBack","Previous frame (,)",()=>oe(-1)),ve,h("stepForward","Next frame (.)",()=>oe(1)),ke,fe,z,se),Ie=null;function Re(u){return u===Ie?!1:(Ie=u,l.setStats(u),!0)}let Ze=Qi(a),ce=Wi(a,{onModeChange:u=>{Ze.hide(),c.el.hidden=u,Se.hidden=u,v.disabled=k.disabled=u,u||(c.resize(),Ue()),Et()},onZoomChange:Et,onRangeChange:u=>l.setAnimationRange(u),onSelectionChange:u=>{l.setFrameSelectionState(u);let g=u.active?u.result:a.result;Re(g)&&g&&u.active&&l.sync(r.settings,g)},animationOptions:()=>l.animationOptions()});a.setFrameSelection=u=>ce.setMode(u),a.setFrameRange=(u,g)=>ce.setRange(u,g),a.setAnimationFps=u=>ce.setPlaybackFps(u),a.frameSelection=()=>ce.exportSelection();let Je=()=>ce.active?ce.currentResult():a.result,nt=m("main.itp-stage",{"data-video":"false"},c.el,ce.el,Se,ce.transport,Ze.el);Ze.bind(fe),Ze.bind(ce.range,{getFrame:ce.frameCanvas}),nt.addEventListener("pointerdown",()=>{o()&&Oe.dataset.lib==="open"&&C("lib")},!0);let Oe=m("div.itp.itp-app",{"data-lib":o()?"closed":Rt("lib","open"),"data-insp":Rt("insp","open")},T,s.el,nt,l.el);At(e,Oe),U(Rt("theme",null)),F.textContent="Starting\u2026";try{a.engine=await li()}catch(u){throw Q(`Could not start: ${u.message}`,{kind:"error"}),u}l.el.querySelector("#itp-backend").textContent=a.engine.backend==="webgl"?"GPU \xB7 ShaderMate":"CPU",l.el.querySelector("#itp-backend").title=a.engine.backend==="webgl"?`WebGL 2: ${a.engine.renderer}`:a.engine.fallbackReason||"CPU renderer",Promise.resolve().then(()=>(Ho(),Go)).then(u=>u.videoSupport()).then(u=>{a.videoSupport=u}).catch(()=>{});let Ye=!1,ot=!1,St=null,rt=document.createElement("canvas");function Ue(){Ye=!0,ot||requestAnimationFrame(We)}a.schedule=Ue;async function We(){if(ot||!Ye||a.exporting||ce.active)return;Ye=!1;let u=a.current;if(!u){a.result=null,c.clear(),qe();return}ot=!0;let g=setTimeout(()=>{G.hidden=!1},250);try{u.type==="video"&&a.engine.invalidate();let S=await a.engine.process(u.source,r.settings);if(u!==a.current||ce.active)return;a.result=S,S.toCanvas(1,{canvas:rt}),c.show(rt,u.source,S.crop),Re(S),l.sync(r.settings,S),St!==u&&(St=u),qe()}catch(S){console.error(S),Q(`Rendering failed: ${S.message}`,{kind:"error"})}finally{clearTimeout(g),G.hidden=!0,ot=!1,Ye&&requestAnimationFrame(We)}}function qe(){let u=a.result,g=a.current;if(f.textContent=g?g.name:"No image",p.textContent=g?g.type==="video"?`${g.width} \xD7 ${g.height}, ${Tn(g.duration)}`:`${g.width} \xD7 ${g.height}`:"",D.hidden=!!g,N.hidden=!g,!g||!u){F.hidden=!0;return}F.hidden=!1,At(F,m("span",{},m("b",{text:`${u.width} \xD7 ${u.height}`})," px"),m("span",{text:`${Math.round(c.zoom*100)/100}\xD7 zoom`})),b.disabled=!r.canUndo,M.disabled=!r.canRedo}function Et(){let u=ce.active?ce:c;x.querySelector("span").textContent=!a.current||u.fitted?"Fit":u.zoom>=1?`${Math.round(u.zoom*10)/10}\xD7`:`${Math.round(u.zoom*100)}%`,a.result&&qe()}r.subscribe((u,g)=>{let S=a.current;S&&S.own&&r.target===S.id?S.own=u:r.target==="shared"&&(a.shared=u),l.sync(u,Je()),b.disabled=!r.canUndo,M.disabled=!r.canRedo,g!=="preset"&&(a.activePreset=null),n&&Be(),s.tab==="palettes"&&s.refresh(),Ze.reset(),ce.refresh(),Ue()});let mt=null,Be=()=>{clearTimeout(mt),mt=setTimeout(()=>_t("settings",a.shared),300)};async function gt(u,g,S){let R=document.createElement("canvas"),q=72/Math.max(g,S);R.width=Math.max(1,Math.round(g*q)),R.height=Math.max(1,Math.round(S*q));try{R.getContext("2d").drawImage(u,0,0,R.width,R.height)}catch{}return R.toDataURL()}async function Fe(u,g,S=null){let R=g.naturalWidth||g.width,q=g.naturalHeight||g.height,Z={id:crypto.randomUUID?.()||String(Math.random()),name:u,type:"image",source:g,width:R,height:q,file:S};return Z.thumb=await gt(g,R,q),a.items.push(Z),Z}async function Ge(u,g){let S=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});S.muted=!0,S.src=URL.createObjectURL(g);try{await Vt(S)}catch(q){if(URL.revokeObjectURL(S.src),q.code===3||q.code===4){let Z=await yi(g).catch(()=>""),ne=Z==="H.264"?"WebM (VP9)":Z==="VP9"?"H.264 MP4":"H.264 MP4 or WebM (VP9)",Ee=new Error(Z?`it's ${Z}, which this browser can't play. Re-save it as ${ne}, or open the editor in a browser that plays ${Z}.`:`this browser can't play this video's format. Re-save it as ${ne}.`);throw Ee.code=q.code,Ee}throw q}let R={id:crypto.randomUUID?.()||String(Math.random()),name:u,type:"video",source:S,width:S.videoWidth,height:S.videoHeight,duration:S.duration,fps:30,file:g};return await zt(S,Math.min(.05,S.duration/2)).catch(()=>{}),R.thumb=await gt(S,R.width,R.height),a.items.push(R),R.fpsReady=Hn(S,30).catch(()=>30).then(q=>{R.fps=q,R.fpsReady=null,a.current===R&&Ke(),l.syncAnim()}),xi(g).then(q=>{R.hasAudio=q,a.current===R&&Ke()}),S.addEventListener("timeupdate",()=>{a.current===R&&Ke()}),S.addEventListener("play",()=>{a.current===R&&(Ke(),$(R))}),S.addEventListener("pause",()=>{a.current===R&&(Ke(),Ue())}),S.addEventListener("seeked",()=>{a.current===R&&!a.exporting&&Ue()}),S.addEventListener("ended",()=>{a.current!==R||a.exporting||R.fpsReady||ce.active||(S.currentTime=0,S.play().catch(()=>{}))}),R}async function st(u){let g=[],S=[],R=[];for(let ne of u)Ic.test(ne.name)&&!/^image|^video/.test(ne.type)?/\.json$/i.test(ne.name)?R.push(ne):S.push(ne):(ia.test(ne.type)||aa.test(ne.type)||/\.(png|jpe?g|gif|webp|bmp|svg|avif|mp4|webm|mov)$/i.test(ne.name))&&g.push(ne);for(let ne of S)await ye(ne);for(let ne of R){let Ee=await ne.text();try{let _e=JSON.parse(Ee);_e.colors||Array.isArray(_e)?await ye(ne,Ee):(r.replace(uo(_e)),Q(`Loaded settings from ${ne.name}`,{kind:"ok"}))}catch(_e){Q(`${ne.name}: ${_e.message}`,{kind:"error"})}}let q=null,Z=g.length>2?Q(`Loading ${g.length} files`,{progress:!0}):null;for(let ne=0;ne<g.length;ne++){let Ee=g[ne];try{let _e;if(aa.test(Ee.type)||/\.(mp4|webm|mov)$/i.test(Ee.name))_e=await Ge(Ee.name,Ee);else{let Mt;try{Mt=await createImageBitmap(Ee)}catch{Mt=new Image,Mt.src=URL.createObjectURL(Ee),await Mt.decode()}_e=await Fe(Ee.name,Mt,Ee)}q||(q=_e)}catch(_e){Q(`${Ee.name} could not be opened: ${_e.message}`,{kind:"error"})}Z?.progress((ne+1)/g.length)}Z?.close(),q&&He(q),s.refresh(),g.length>1&&Q(`Added ${g.length} files. They share one set of settings.`,{kind:"ok"})}a.addFiles=st;async function bt(){let u=await jn({accept:"image/*,video/*,.gpl,.hex,.pal,.txt,.json",multiple:!0});u.length&&st(u)}a.openFiles=bt;async function kt(u){let g=await ea(u),S=await Fe(`${u.name}.svg`,g,new File([u.svg],`${u.name}.svg`,{type:"image/svg+xml"}));He(S),s.refresh()}async function yt(){try{let u=await navigator.clipboard.read(),g=[];for(let S of u)for(let R of S.types)if(ia.test(R)){let q=await S.getType(R);g.push(new File([q],`pasted-${new Date().toISOString().slice(11,19).replace(/:/g,"")}.${R.split("/")[1]}`,{type:R}))}g.length?st(g):Q("The clipboard has no image",{kind:"error"})}catch{Q("Press Ctrl+V (\u2318V) to paste. The browser blocked direct clipboard access.")}}a.pasteFromClipboard=yt;function He(u){a.current&&a.current.type==="video"&&a.current!==u&&a.current.source.pause(),a.current=u,Ze.reset(),ce.setItem(u),ct(u),nt.dataset.video=String(u&&u.type==="video"),u&&u.type==="video"&&Ke(),c.clear(),a.result=null,c.picking&&te(),s.refresh(),s.sourceChanged(),Ue(),qe()}a.select=He;function It(u){let g=a.items.indexOf(u);g<0||(a.items.splice(g,1),r.dropTarget(u.id),u.type==="video"&&(u.source.pause(),URL.revokeObjectURL(u.source.src)),u.source.close&&!a.items.some(S=>S.source===u.source)&&u.source.close(),a.current===u&&He(a.items[Math.min(g,a.items.length-1)]||null),s.refresh(),l.sync(r.settings,Je()))}a.removeItem=It,a.clearItems=()=>{for(let u of a.items.slice())It(u)};let De=u=>u===a.current?r.settings:u&&u.own||a.shared;a.settingsFor=De;let $e=u=>JSON.parse(JSON.stringify(u));function ct(u,g=!1){let S=u&&u.own?u.id:"shared";r.target===S&&!g||r.setTarget(S,S==="shared"?a.shared:u.own)}function Qe(u,g,{quiet:S=!1}={}){if(!(!u||!!u.own===g)){if(g)u.own=$e(De(u)),u===a.current&&ct(u),S||Q(`${u.name} now has its own settings. Changes no longer affect other files.`);else{let R=u.own;u.own=null,r.dropTarget(u.id),u===a.current&&ct(u),S||Q(`${u.name} uses the shared settings again`,{action:{label:"Undo",onClick:()=>{u.own=R,u===a.current&&ct(u),je()}}})}je()}}function je(){s.refresh();let u=Je();l.sync(r.settings,u),u&&Re(u),Ue()}a.setOwn=Qe,a.copySettings=u=>{a.clipboard=$e(De(u)),Q(`Copied the settings of ${u.name}`,{timeout:1800}),s.refresh()},a.pasteSettings=u=>{a.clipboard&&(u.own||Qe(u,!0,{quiet:!0}),u===a.current?r.replace(a.clipboard,"paste"):u.own=$e(a.clipboard),Q(`Pasted settings onto ${u.name}`,{kind:"ok",timeout:1800}),je())},a.applyToAll=u=>{let g={shared:a.shared,own:new Map(a.items.map(S=>[S,S.own]))};a.shared=$e(De(u));for(let S of a.items)S.own&&r.dropTarget(S.id),S.own=null;r.setTarget("shared",a.shared),n&&Be(),Q(`Every file now uses the settings of ${u.name}`,{action:{label:"Undo",onClick:()=>{a.shared=g.shared;for(let[S,R]of g.own)S.own=R;ct(a.current,!0),je()}}}),je()},a.duplicate=async u=>{let g;u.type==="video"?g=await Ge(lt(u.name),u.file):g=await Fe(lt(u.name),u.source,u.file),a.items.splice(a.items.indexOf(g),1),a.items.splice(a.items.indexOf(u)+1,0,g),g.own=$e(De(u)),He(g),Q(`Duplicated ${u.name}. The copy has its own settings.`,{timeout:2400})};let lt=u=>{let g=/^(.*?)(\.[^.]*)?$/.exec(u);return`${g[1]} copy${g[2]||""}`};a.move=(u,g)=>{let S=a.items.indexOf(u),R=S+g;S<0||R<0||R>=a.items.length||([a.items[S],a.items[R]]=[a.items[R],a.items[S]],s.refresh(),(document.activeElement===document.body||document.activeElement?.closest?.(".itp-files"))&&s.focusFile(u))};let Ve=u=>{let g=/^(.*?)(\.[^.\s]{1,5})?$/.exec(u);return[g[1],g[2]||""]};a.rename=(u,g)=>{let[,S]=Ve(u.name),R=String(g||"").trim().replace(/[\\/:*?"<>|]+/g,"-");S&&R.toLowerCase().endsWith(S.toLowerCase())&&(R=R.slice(0,-S.length)),!(!R||R+S===u.name)&&(u.name=R+S,s.refresh(),qe())};function Ne(u){if(!u||f.hidden)return;a.current!==u&&He(u);let[g]=Ve(u.name),S=m("input.itp-name-input",{type:"text",value:u.name,"aria-label":"File name",spellcheck:!1});S.style.width=`${Math.min(40,Math.max(12,u.name.length+2))}ch`,f.hidden=!0,f.after(S),S.focus(),S.setSelectionRange(0,g.length);let R=!1,q=Z=>{R||(R=!0,Z&&a.rename(u,S.value),S.remove(),f.hidden=!1)};S.addEventListener("keydown",Z=>{Z.stopPropagation(),Z.key==="Enter"&&(Z.preventDefault(),q(!0)),Z.key==="Escape"&&(Z.preventDefault(),q(!1))}),S.addEventListener("blur",()=>q(!0))}a.startRename=Ne;let it=null;a.savedWorkspace=()=>it;async function xt(u){if(u.file)return u.file;let g=document.createElement("canvas");return g.width=u.width,g.height=u.height,g.getContext("2d").drawImage(u.source,0,0),new Promise(S=>g.toBlob(R=>S(R),"image/png"))}async function Ct(){if(n){if(!a.items.length){if(it){await Lt();return}Q("Add files first, then Save keeps them here for next time.");return}I.disabled=!0;try{let u=[];for(let R of a.items)u.push({name:R.name,type:R.type,file:await xt(R),own:R.own?$e(R.own):null});let g=await ta({shared:$e(a.shared),current:Math.max(0,a.items.indexOf(a.current)),items:u}),S=!it;it={count:u.length,bytes:g,savedAt:Date.now()},s.refresh(),Q(S?`Saved ${u.length} file${u.length===1?"":"s"} (${Zo(g)}) in this browser only. They reopen next time; remove them with Forget in the Files list.`:`Saved ${u.length} file${u.length===1?"":"s"} (${Zo(g)})`,{kind:"ok",timeout:S?7e3:2200})}catch(u){console.error(u),Q(ra(u)?"Not enough browser storage to save these files. Remove some (videos are large) and try again.":`Couldn't save: ${u.message}`,{kind:"error"})}finally{I.disabled=!1}}}a.saveWorkspace=Ct;async function Lt(){try{await oa()}catch(u){Q(`Couldn't remove the saved files: ${u.message}`,{kind:"error"});return}it=null,s.refresh(),Q("Removed the saved files from this browser. Files open now stay open.")}a.forgetWorkspace=Lt;async function ut(){let u=await na();if(!u)return;if(it={count:u.items.length,bytes:u.items.reduce((q,Z)=>q+(Z.file?Z.file.size:0),0),savedAt:u.savedAt},a.items.length||!u.items.length){s.refresh();return}u.shared&&!/[#&]s=/.test(location.hash)&&r.setTarget("shared",u.shared);let g=u.items.length>2?Q(`Opening ${u.items.length} saved files`,{progress:!0}):null,S=[];for(let q=0;q<u.items.length;q++){let Z=u.items[q];try{let ne=Z.file instanceof File?Z.file:new File([Z.file],Z.name,{type:Z.file.type}),Ee;if(Z.type==="video")Ee=await Ge(Z.name,ne);else{let _e;try{_e=await createImageBitmap(ne)}catch{_e=new Image,_e.src=URL.createObjectURL(ne),await _e.decode()}Ee=await Fe(Z.name,_e,ne)}Ee.own=Z.own||null,S.push(Ee)}catch(ne){console.warn("[workspace] skipped",Z.name,ne)}g?.progress((q+1)/u.items.length)}g?.close();let R=S[Math.min(u.current||0,S.length-1)];R&&He(R),s.refresh(),S.length&&Q(`Reopened your saved files (${S.length})`,{timeout:2200})}function Ke(){let u=a.current;if(!u||u.type!=="video")return;let g=u.source;ve.innerHTML=ie(g.paused?"play":"pause"),ve.setAttribute("aria-label",g.paused?"Play (Space)":"Pause (Space)");let S=Math.floor(g.currentTime*u.fps+1e-6);ke.innerHTML=`${Tn(g.currentTime)} <span>/ ${Tn(g.duration)}</span>`,ke.title=`Frame ${S}`,fe.value=String(Math.round(g.currentTime/(g.duration||1)*1e3)),fe.style.setProperty("--p",`${fe.value/10}%`),se.textContent=`${u.fps} fps`,z.hidden=u.hasAudio===!1,dt(g)}function dt(u){u&&!a.exporting&&!a.current?.fpsReady&&(u.muted!==de.muted&&(u.muted=de.muted),u.volume!==de.volume&&(u.volume=de.volume));let g=de.muted?0:de.volume,S=Math.round(g*100);ze.innerHTML=ie(g?"volume":"volumeOff");let R=g?`Volume ${S}% (M mutes)`:"Muted (M unmutes)";ze.setAttribute("aria-label",R),ze.title=R,V.setAttribute("aria-valuenow",String(S)),V.setAttribute("aria-valuetext",g?`${S}%`:"Muted"),V.style.setProperty("--v",`${S}%`),Ce.textContent=g?String(S):"Off"}function L(u){Object.assign(de,u),u.muted===!1&&!de.volume&&(de.volume=1),_t("muted",de.muted),_t("volume",de.volume),dt(a.current&&a.current.type==="video"?a.current.source:null)}function $(u){let g=u.source,S=()=>{g.paused||a.current!==u||(Ue(),"requestVideoFrameCallback"in g?g.requestVideoFrameCallback(S):requestAnimationFrame(S))};S()}async function Y(){let u=a.current;if(!(!u||u.type!=="video")){if(ce.active){ce.toggleAnimation();return}if(!u.source.paused){u.source.pause();return}u.fpsReady&&await u.fpsReady,!(a.current!==u||ce.active)&&(dt(u.source),u.source.ended&&(u.source.currentTime=0),u.source.play().catch(g=>Q(g.message,{kind:"error"})))}}function oe(u){let g=a.current;if(!g||g.type!=="video"||ce.active)return;let S=g.source;S.pause();let R=Math.floor(S.currentTime*g.fps+1e-6)+u;zt(S,(Math.max(0,R)+.5)/g.fps).then(()=>{Ke(),Ue()})}fe.addEventListener("input",()=>{let u=a.current;!u||u.type!=="video"||(u.source.currentTime=fe.value/1e3*u.source.duration)});function he(u){if(ce.active)return;let g=u??!c.compare;c.setCompare(g),v.setAttribute("aria-pressed",String(g))}function ae(u){if(ce.active)return;let g=u??!c.grid;c.setGrid(g),k.setAttribute("aria-pressed",String(g)),g&&c.zoom<6&&a.result&&Q("The grid shows from 6\xD7 zoom")}function Le(u){let g=ce.active?ce:c;vn(u,[{label:ce.active?"Fit canvas to view":"Fit to view",kbd:"F",icon:"fit",onClick:()=>g.fit()},"sep",...[1,2,4,8,16,32].map(S=>({label:`${S}\xD7`,sub:S===1&&!ce.active?"One screen pixel per pixel":null,onClick:()=>g.zoomTo(S)})),"sep",{label:"Zoom in",kbd:"+",icon:"zoomIn",onClick:()=>g.zoomStep(1)},{label:"Zoom out",kbd:"-",icon:"zoomOut",onClick:()=>g.zoomStep(-1)}])}function C(u){let g=u==="lib"?"lib":"insp",S=Oe.dataset[g]!=="open";Oe.dataset[g]=S?"open":"closed",(!o()||u==="insp")&&_t(g,Oe.dataset[g]),requestAnimationFrame(()=>c.resize())}function U(u){u?document.documentElement.dataset.theme=u:delete document.documentElement.dataset.theme;let g=u?u==="dark":!matchMedia("(prefers-color-scheme: light)").matches;w.innerHTML=ie(g?"sun":"moon"),w.setAttribute("aria-label",g?"Switch to light theme (T)":"Switch to dark theme (T)"),c.redraw()}function B(){let g=(document.documentElement.dataset.theme||(matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"))==="dark"?"light":"dark";_t("theme",g),U(g)}function K(u,g=4096){let S=u.width,R=u.height,q=Math.min(1,g/Math.max(S,R)),Z=document.createElement("canvas");Z.width=Math.round(S*q),Z.height=Math.round(R*q);let ne=Z.getContext("2d",{willReadFrequently:!0});return ne.drawImage(u.source,0,0,Z.width,Z.height),ne.getImageData(0,0,Z.width,Z.height)}function re(u,g){let S=a.current;if(!S)return;let R=K(S,1024),q=a.result?a.result.crop:{x:0,y:0,w:1,h:1},Z=Math.min(R.width-1,Math.floor((q.x+u*q.w)*R.width)),Ee=(Math.min(R.height-1,Math.floor((q.y+g*q.h)*R.height))*R.width+Z)*4,_e=qt([R.data[Ee],R.data[Ee+1],R.data[Ee+2]]),Mt=r.settings,Jo=Mt.palette.source==="custom"?Mt.palette.colors:[];if(Jo.includes(_e))return Q(`${_e} is already in the palette`);r.update({palette:{source:"custom",name:Mt.palette.source==="custom"?Mt.palette.name:"Picked",colors:[...Jo,_e]}}),Q(`Added ${_e}`,{kind:"ok",timeout:1500})}let j=null;function te(u){u&&(j=u);let g=!c.picking;c.setPicking(g),j?.setAttribute("aria-pressed",String(g)),g&&(he(!0),Q("Click the image to add colours. Press Esc when done."))}a.togglePicker=te;function le(u){u.id&&!u.custom?r.update({palette:{source:"builtin",id:u.id}}):r.update({palette:{source:"custom",name:u.name,colors:u.colors}})}a.usePalette=le;function Ae(u,g){let S=a.userPalettes.filter(R=>R.name!==u);S.unshift({name:u,colors:g,custom:!0}),a.userPalettes=S.slice(0,100),n&&_t("palettes",a.userPalettes),s.tab==="palettes"&&s.refresh()}async function ye(u,g){try{let S=Co(g??await u.text(),u.name);Ae(S.name||"Imported",S.colors),r.update({palette:{source:"custom",name:S.name||"Imported",colors:S.colors}}),Q(`Imported "${S.name}" (${S.colors.length} colours)`,{kind:"ok"})}catch(S){Q(`${u.name}: ${S.message}`,{kind:"error"})}}a.importPalette=async()=>{let[u]=await jn({accept:".gpl,.hex,.pal,.txt,.json"});u&&ye(u)},a.savePalette=()=>{let u=r.settings,g=u.palette.source==="extract"?a.result?.palette||[]:u.palette.colors;if(!g.length)return Q("There is no palette to save",{kind:"error"});let S=m("input.itp-input",{value:u.palette.source==="custom"?u.palette.name:`${u.palette.name} copy`,"aria-label":"Palette name"}),R=m("select.itp-select",{"aria-label":"Also download as"},m("option",{value:"",text:"Don't download"}),m("option",{value:"gpl",text:".gpl (GIMP, Aseprite)"}),m("option",{value:"hex",text:".hex (Lospec)"}),m("option",{value:"json",text:".json"}));En("Save palette",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Name"})),S),m("div.itp-field",{},m("div.lab",{},m("span",{text:"Also download as"})),R),m("div.itp-strip",{style:{height:"18px"}},...g.map(q=>m("i",{style:{background:q}})))],{actions:[{label:"Cancel"},{label:"Save",primary:!0,onClick:()=>{let q=S.value.trim()||"Palette";Ae(q,g),r.update({palette:{source:"custom",name:q,colors:g}});let Z=q.replace(/[^\w-]+/g,"-").toLowerCase();R.value==="gpl"&&vt(di(q,g),`${Z}.gpl`,"text/plain"),R.value==="hex"&&vt(fi(g),`${Z}.hex`,"text/plain"),R.value==="json"&&vt(pi(q,g),`${Z}.json`,"application/json"),Q(`Saved "${q}" to Your palettes`,{kind:"ok"})}}]}),S.select()},a.deletePalette=u=>{a.userPalettes=a.userPalettes.filter(g=>g!==u),n&&_t("palettes",a.userPalettes),s.refresh(),Q(`Deleted "${u.name}"`,{action:{label:"Undo",onClick:()=>Ae(u.name,u.colors)}})},a.lospecDialog=()=>{let u=m("input.itp-input",{placeholder:"e.g. rgbg-36 or a lospec.com palette URL","aria-label":"Lospec slug or URL"}),g=m("div.help",{text:"Looks the palette up on lospec.com. Needs an internet connection."}),S=En("Palette from Lospec",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Slug or URL"})),u,g)],{actions:[{label:"Cancel"},{label:"Fetch",primary:!0,onClick:async()=>{g.textContent="Fetching\u2026",g.style.color="";try{let R=await hi(u.value);return Ae(R.name,R.colors),r.update({palette:{source:"custom",name:R.name,colors:R.colors}}),Q(`Loaded "${R.name}" from Lospec`,{kind:"ok"}),!0}catch(R){return g.textContent=R.message,g.style.color="var(--danger)",!1}}}]});u.addEventListener("keydown",R=>{R.key==="Enter"&&S.querySelector("footer .primary").click()}),u.focus()},a.detectGrid=()=>{let u=a.current;if(!u||u.type!=="image")return Q("Open an image first",{kind:"error"});let g=si(K(u));if(g<=1)return Q("No pixel grid found. This image doesn't look upscaled.");r.update({size:{mode:"block",block:g,resample:"nearest"}}),Q(`Found ${g} px blocks: switched to pixel size ${g} with nearest sampling`,{kind:"ok"})},a.settingsJSON=()=>an(r.settings),a.copyLink=async()=>{let u=`${location.origin}${location.pathname}#s=${co(r.settings)}`;try{await navigator.clipboard.writeText(u),Q("Link copied. It holds the settings, not the image.",{kind:"ok"})}catch{En("Share link",[m("textarea.itp-input",{rows:3,readOnly:!0,value:u})])}history.replaceState(null,"",`#s=${co(r.settings)}`)},a.saveSettingsFile=()=>vt(an(r.settings),"image-to-pixel-settings.json","application/json"),a.loadSettingsFile=async()=>{let[u]=await jn({accept:".json,application/json"});if(u)try{r.replace(uo(await u.text())),Q(`Loaded ${u.name}`,{kind:"ok"})}catch(g){Q(`${u.name}: ${g.message}`,{kind:"error"})}},a.resetSettings=()=>{r.replace(Dt()),Q("Settings reset",{action:{label:"Undo",onClick:()=>r.undo()}})},a.applyPreset=u=>{r.replace(Ht(Dt(),{...u.settings,export:r.settings.export}),"preset"),a.activePreset=u.id,s.refresh()},Object.assign(a,d);function we(u){let g=a.current,S=g&&g.type==="video",R=a.items.filter(Ee=>Ee.type==="image").length,q=r.settings,Z=ce.active,ne=Z?"Turn off frame selection first":null;vn(u,[{group:"Image"},{label:"PNG",sub:ne||(a.result?`${a.result.width*q.export.scale} \xD7 ${a.result.height*q.export.scale}, ${q.export.scale}\xD7 scale`:"Open an image first"),icon:"image",kbd:"Ctrl S",disabled:!a.result||Z,onClick:()=>a.exportPNG()},{label:"Copy to clipboard",sub:ne,icon:"copy",disabled:!a.result||Z,onClick:()=>a.copyImage()},{label:a.items.length>1?`All ${a.items.length} files as ZIP`:"All files as ZIP",sub:a.items.length>1?null:"Add two or more files",icon:"zip",disabled:a.items.length<2,onClick:()=>a.exportZip()},{group:"Animation"},{label:S?"GIF from this video":"GIF from all images",icon:"gif",disabled:!S&&R<2,onClick:()=>a.exportAnimation({...Te(),format:"gif"})},{label:"More formats\u2026",sub:"WebM, MP4, PNG sequence, sprite sheet",icon:"film",onClick:()=>{l.setTab("export"),Oe.dataset.insp!=="open"&&C("insp")}},{group:"Other"},{label:"Tileset",sub:ne||"16 \xD7 16 tiles, duplicates removed",icon:"tiles",disabled:!a.result||Z,onClick:()=>a.exportTileset({tile:16,flips:!1})},{label:"Copy settings link",icon:"link",onClick:()=>a.copyLink()},{label:"Settings as JSON",icon:"braces",onClick:()=>a.saveSettingsFile()}])}let Te=()=>{let u=a.current,g=u&&u.type==="video";return{source:g?"video":"files",fps:g?Math.min(30,Math.round(u.fps||12)):8,start:0,end:g?u.duration:0}};function E(){En("Keyboard shortcuts",[m("div.itp-keys",{},...[["Open files","Ctrl O"],["Paste image","Ctrl V"],["Export PNG","Ctrl S"],["Undo","Ctrl Z"],["Redo","Ctrl Shift Z"],["Compare","C"],["Pixel grid","G"],["Fit","F"],["Zoom in / out","+ -"],["Pixel width \xB11","[ ]"],["Pixel width \xB18","Shift [ ]"],["Next / previous dither","D Shift D"],["Play / pause video","Space"],["Mute / unmute video","M"],["Rename file","F2"],["Step one frame",", ."],["Library","\\"],["Inspector","/"],["Theme","T"],["Next / previous file","Alt \u2193 \u2191"],["Move file down / up","Alt Shift \u2193 \u2191"],["This list","?"]].map(([g,S])=>m("div",{},m("span",{text:g}),m("span",{},...S.split(" ").filter(Boolean).map(R=>m("kbd",{text:R}))))))])}let X=u=>u.target.closest('input, select, textarea, [contenteditable="true"]')&&!(u.target.type==="range"||u.target.type==="checkbox"),ue=["none","bayer4","bayer8","bluenoise","cluster4","floyd-steinberg","atkinson","sierra-lite","jarvis"];window.addEventListener("keydown",u=>{if(!Oe.isConnected||document.querySelector("dialog[open]"))return;let g=u.ctrlKey||u.metaKey,S=u.key;if(g&&S.toLowerCase()==="z"){if(X(u))return;u.preventDefault(),u.shiftKey?r.redo():r.undo();return}if(g&&S.toLowerCase()==="y"){if(X(u))return;u.preventDefault(),r.redo();return}if(g&&S.toLowerCase()==="s"){u.preventDefault(),a.exportPNG();return}if(g&&S.toLowerCase()==="o"){u.preventDefault(),bt();return}if(g||u.altKey&&!["ArrowUp","ArrowDown"].includes(S))return;if(X(u)){S==="Escape"&&u.target.blur();return}let R=r.settings;switch(S){case"c":case"C":he();break;case"g":case"G":ae();break;case"f":case"F":ce.active?ce.fit():c.fit();break;case"+":case"=":ce.active?ce.zoomStep(1):c.zoomIn();break;case"-":case"_":ce.active?ce.zoomStep(-1):c.zoomOut();break;case"t":case"T":B();break;case"\\":C("lib");break;case"/":C("insp");break;case"?":E();break;case"[":case"{":r.update({size:{mode:"width",width:Math.max(8,R.size.width-(u.shiftKey?8:1))}},{key:"kw"});break;case"]":case"}":r.update({size:{mode:"width",width:R.size.width+(u.shiftKey?8:1)}},{key:"kw"});break;case"d":case"D":{let q=ue.indexOf(R.dither.method),Z=ue[(q+(u.shiftKey?-1:1)+ue.length)%ue.length];r.update({dither:{method:Z}}),Q(Z==="none"?"No dither":Z.replace(/-/g," "),{timeout:900});break}case" ":if(u.target.closest("button"))break;a.current?.type==="video"&&(u.preventDefault(),Y());break;case"F2":a.current&&(u.preventDefault(),Ne(a.current));break;case"m":case"M":a.current?.type==="video"&&!z.hidden&&(u.preventDefault(),L({muted:!de.muted}));break;case",":oe(-1);break;case".":oe(1);break;case"Escape":c.picking?te():nn();break;case"ArrowDown":case"ArrowUp":if(u.altKey&&u.shiftKey&&a.current){u.preventDefault(),a.move(a.current,S==="ArrowDown"?1:-1);break}if(u.altKey&&a.items.length>1){u.preventDefault();let q=a.items.indexOf(a.current);He(a.items[(q+(S==="ArrowDown"?1:-1)+a.items.length)%a.items.length])}break;default:return}});let Me=0;return Oe.addEventListener("dragenter",u=>{[...u.dataTransfer.types].includes("Files")&&(Me++,Oe.classList.add("itp-dragging"))}),Oe.addEventListener("dragleave",()=>{--Me<=0&&(Me=0,Oe.classList.remove("itp-dragging"))}),Oe.addEventListener("dragover",u=>{[...u.dataTransfer.types].includes("Files")&&u.preventDefault()}),Oe.addEventListener("drop",u=>{u.preventDefault(),Me=0,Oe.classList.remove("itp-dragging"),u.dataTransfer.files.length&&st([...u.dataTransfer.files])}),window.addEventListener("paste",u=>{if(!Oe.isConnected||X(u))return;let g=[...u.clipboardData?.files||[]];if(g.length){u.preventDefault(),st(g);return}let S=u.clipboardData?.getData("text")||"";if(/#?[0-9a-f]{6}/i.test(S)&&/\n|,|\s/.test(S.trim()))try{let R=Co(S);r.update({palette:{source:"custom",name:"Pasted",colors:R.colors}}),Q(`Pasted a ${R.colors.length}-colour palette`,{kind:"ok"})}catch{}}),window.addEventListener("hashchange",()=>{if(/[#&]s=/.test(location.hash))try{r.replace(lo(location.hash))}catch{}}),l.sync(r.settings,null),s.refresh(),qe(),b.disabled=M.disabled=!0,n&&t.restore!==!1&&ut().catch(u=>console.warn("[workspace]",u)),{app:a,store:r,addFiles:st,async addImage(u,g="image"){let S=await Fe(g,u);return He(S),s.refresh(),S},openSample:u=>kt(oo.find(g=>g.id===u)||oo[0]),applyPreset:u=>{let g=yn.find(S=>S.id===u);g&&a.applyPreset(g)},setTheme:u=>{_t("theme",u),U(u)},get result(){return a.result},get view(){return c.rect},async idle(){for(let u=0;u<200&&(Ye||ot);u++)await new Promise(g=>setTimeout(g,25))}}}export{oo as SAMPLES,pd as mountEditor};
372
372
  /*! Bundled license information:
373
373
 
374
374
  shadermate/dist/shadermate.esm.js: