@cyberart-io/engine 0.0.7 → 0.0.8
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.
- package/README.md +3 -0
- package/dist/headless.d.ts +126 -60
- package/dist/headless.js +1 -1
- package/dist/index.d.ts +86 -67
- package/dist/index.js +1 -1
- package/docs/frame-benchmark.md +107 -0
- package/docs/headless-harness.md +5 -1
- package/package.json +1 -1
package/dist/headless.js
CHANGED
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
* Not an OSI open-source license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
var Fr=Object.defineProperty;var un=(e,t)=>()=>(e&&(t=e(e=0)),t);var Hr=(e,t)=>{for(var n in t)Fr(e,n,{get:t[n],enumerable:!0})};var ai={};function si(e,t){let n=e.indexOf(Hn);if(n===-1)return null;let r=n+Hn.length,o=`const __cyberSkip=new Set(${JSON.stringify(t)});const __cyberOrig=registerProcessor;registerProcessor=(n,p)=>__cyberSkip.has(n)?undefined:__cyberOrig(n,p);`;return e.slice(0,r)+o+e.slice(r)}var Nt,dt,oi,je,Hn,On=un(()=>{"use strict";Nt=/AudioWorkletProcessor with name:\s*["'`][^"'`]+["'`]\s+is already registered/i,dt="__cyberartWorkletPatchApplied";typeof window<"u"&&!window[dt]&&(window.addEventListener("error",e=>{let t=e?.message??"";Nt.test(t)&&(e.preventDefault(),e.stopImmediatePropagation())},!0),window.addEventListener("unhandledrejection",e=>{let t=e?.reason,n=typeof t=="string"?t:t?.message??"";Nt.test(n)&&e.preventDefault()}),window[dt]=!0);oi=!1,je=(...e)=>{oi&&console.log("[workletPatch]",...e)},Hn="((AudioWorkletProcessor,registerProcessor)=>{";if(typeof AudioWorklet<"u"&&!AudioWorklet.prototype[dt]){let e=new WeakMap,t=/registerProcessor\s*\(\s*['"`]([^'"`]+)['"`]/g,n=AudioWorklet.prototype.addModule,r=0;AudioWorklet.prototype.addModule=async function(o,a){let d=++r,h=e.get(this);h||(h=new Set,e.set(this,h)),je(`#${d} addModule`,{url:o.slice(0,64),isBlob:o.startsWith("blob:"),knownBefore:[...h]});let y=o,S=null;if(o.startsWith("blob:")){let g=null;try{g=await(await fetch(o)).text()}catch(k){je(`#${d} blob fetch failed`,k)}if(g!==null){let k=new Set;for(let F of g.matchAll(t))k.add(F[1]);if(k.size>0){let F=[...k].filter(E=>h.has(E)),x=[...k].filter(E=>!h.has(E));if(F.length>0&&x.length===0){je(`#${d} short-circuit \u2014 all processors already registered`,F);return}if(F.length>0&&x.length>0){let E=si(g,F);if(E!==null){let V=new Blob([E],{type:"application/javascript"});S=URL.createObjectURL(V),y=S,je(`#${d} rewrote blob; skipping`,F,"allowing",x)}else je(`#${d} blob rewrite failed; passing original through`)}x.forEach(E=>h.add(E))}}}return n.call(this,y,a).then(()=>{S&&URL.revokeObjectURL(S)},g=>{S&&URL.revokeObjectURL(S);let k=(g&&g.message)??"";if(!(Nt.test(k)||/already registered/i.test(k)))throw g})},AudioWorklet.prototype[dt]=!0}});var Nn={};Hr(Nn,{AUDIO_LIBRARIES:()=>Kt,adaptersFor:()=>lt,importTone:()=>ut,normalizeAudioLibraries:()=>ct});async function ut(){let e=await import("tone");if(typeof e.start=="function")return e;let t=e.default;return t&&typeof t.start=="function"?t:e}function ct(e){if(!e)return[];let t=Array.isArray(e)?e:[e],n=[];for(let r of t){if(!(r in Kt)){console.warn(`Unknown audio library "${r}"`);continue}let i=r;n.includes(i)||n.push(i)}return n}function lt(e){return e.map(t=>Kt[t])}var _n,Kt,Ut=un(()=>{"use strict";_n={id:"tone",async load(){await Promise.resolve().then(()=>(On(),ai))},async unlock(){await _n.load(),await(await ut()).start()},async resumeIfSuspended(){let e=await ut();e.context.state==="suspended"&&await e.context.resume()},async suspendIfRunning(){let t=(await ut()).context.rawContext;"suspend"in t&&t.state==="running"&&await t.suspend()}},Kt={tone:_n}});var ne=class extends Error{constructor(n,r){super(r?`Headless Canvas2D does not support ${n}: ${r}`:`Headless Canvas2D does not support ${n}`);this.name="HeadlessUnsupportedOperationError";this.operation=n}},ke=class{constructor(t,n,r,i,o,a=0,d=0){this.stops=[];this.kind=t,this.x0=n,this.y0=r,this.x1=i,this.y1=o,this.r0=a,this.r1=d}addColorStop(t,n){if(!Number.isFinite(t)||t<0||t>1)throw new ne("addColorStop","offset must be in [0, 1]");this.stops.push({offset:t,color:nt(n)}),this.stops.sort((r,i)=>r.offset-i.offset)}colorAt(t){let n=t<0?0:t>1?1:t;if(this.stops.length===0)return{r:0,g:0,b:0,a:0};if(this.stops.length===1||n<=this.stops[0].offset)return this.stops[0].color;let r=this.stops[this.stops.length-1];if(n>=r.offset)return r.color;for(let i=1;i<this.stops.length;i++){let o=this.stops[i],a=this.stops[i-1];if(n<=o.offset){let d=o.offset-a.offset,h=d===0?0:(n-a.offset)/d;return $r(a.color,o.color,h)}}return r.color}},Rt={a:1,b:0,c:0,d:1,e:0,f:0},Or={black:"#000000",white:"#ffffff",red:"#ff0000",green:"#008000",blue:"#0000ff",cyan:"#00ffff",magenta:"#ff00ff",yellow:"#ffff00",gold:"#ffd700",orange:"#ffa500",navy:"#000080",gray:"#808080",grey:"#808080",transparent:"#00000000"},Te=new WeakMap,mn,cn=!1,Dt=class{constructor(t,n,r,i){this.context=null;this.onDeviceReset=null;this.canvas=t,this.width=Math.max(0,n|0),this.height=Math.max(0,r|0),this.alpha=i.alpha!==!1,this.pixels=new Uint8ClampedArray(this.width*this.height*4),this.glyphAtlas=i.glyphAtlas??mn??bn(),this.alpha||this.fillOpaqueBlack()}resize(t,n,r=!1){let i=Math.max(0,t|0),o=Math.max(0,n|0);i!==this.width||o!==this.height?(this.width=i,this.height=o,this.pixels=new Uint8ClampedArray(i*o*4)):r&&this.pixels.fill(0),this.alpha||this.fillOpaqueBlack()}fillOpaqueBlack(){let t=this.pixels;for(let n=3;n<t.length;n+=4)t[n]=255}};function _r(e,t,n){let r=n??new Uint8ClampedArray(e*t*4);if(r.length!==e*t*4)throw new ne("createImageFixture","data length must be width*height*4");return{__headlessImage:!0,width:e,height:t,data:r}}function Mt(e){mn=e}function Nr(e){return Te.get(e)}function Lt(e,t={}){let n=Te.get(e);if(n?.context)return n.context;let r=Math.max(0,Number(e.width)||0),i=Math.max(0,Number(e.height)||0),o=new Dt(e,r,i,t);Te.set(e,o);let a=Kr(o);return o.context=a,a}function hn(e){let t=Te.get(e);if(t)return t.resize(e.width,e.height,!1),De(t.width,t.height,t.pixels)}function Kr(e){let t={...Rt},n=[],r="#000000",i="#000000",o={r:0,g:0,b:0,a:255},a={r:0,g:0,b:0,a:255},d=1,h="source-over",y=1,S="butt",g="10px sans-serif",k="start",F="alphabetic",x=null,E=!0,V=[],U=null,W=(l,v)=>{U={points:[c(l,v)],closed:!1},V.push(U)},p=(l,v)=>{if(!U){W(l,v);return}U.points.push(c(l,v))},b=()=>{if(!U||U.points.length===0)return;U.closed=!0;let l=U.points[0];U.points.push({x:l.x,y:l.y})},c=(l,v)=>({x:t.a*l+t.c*v+t.e,y:t.b*l+t.d*v+t.f}),u=()=>{if(h!=="source-over"&&h!=="copy")throw new ne("globalCompositeOperation",h)},R=()=>{e.resize(e.canvas.width,e.canvas.height,!1)},B=()=>{t={...Rt},n.length=0,V.length=0,U=null,x=null,r="#000000",i="#000000",o={r:0,g:0,b:0,a:255},a={r:0,g:0,b:0,a:255},d=1,h="source-over",y=1,S="butt",g="10px sans-serif",k="start",F="alphabetic",E=!0};e.onDeviceReset=B;let te=(l,v,w,P=h)=>{if(l<0||v<0||l>=e.width||v>=e.height||x&&x[v*e.width+l]===0)return;let T=(v*e.width+l)*4,L=e.pixels;if(P==="copy"){L[T]=w.r,L[T+1]=w.g,L[T+2]=w.b,L[T+3]=e.alpha?w.a:255;return}let K=Math.round(w.a/255*d*255);if(K<=0)return;if(K>=255){L[T]=w.r,L[T+1]=w.g,L[T+2]=w.b,L[T+3]=255;return}let $=K/255,s=L[T+3]/255,A=$+s*(1-$);if(A<=0){L[T]=0,L[T+1]=0,L[T+2]=0,L[T+3]=e.alpha?0:255;return}L[T]=Math.round((w.r*$+L[T]*s*(1-$))/A),L[T+1]=Math.round((w.g*$+L[T+1]*s*(1-$))/A),L[T+2]=Math.round((w.b*$+L[T+2]*s*(1-$))/A),L[T+3]=e.alpha?Math.round(A*255):255},_=(l,v,w,P)=>{if(!(l instanceof ke))return v;let T=tt(t,w+.5,P+.5);return Br(l,T.x,T.y)},Y=(l,v,w,P,T)=>{u(),R();let L=It(l,e.width,e.height);if(L)for(let K=L.minY;K<=L.maxY;K++)for(let $=L.minX;$<=L.maxX;$++){let s=$+.5,A=K+.5;ln(l,s,A,P)&&te($,K,_(v,w,$,K),T)}},q=l=>{u(),R();let v=Math.sqrt(Math.abs(t.a*t.d-t.b*t.c)),w=y*(v===0?1:v)/2,P=It(l,e.width,e.height,w+1);if(P)for(let T=P.minY;T<=P.maxY;T++)for(let L=P.minX;L<=P.maxX;L++)jr(l,L+.5,T+.5,w,S)&&te(L,T,_(i,a,L,T))},f=(l,v)=>{if(l instanceof ke){v==="fillStyle"?(r=l,o={r:0,g:0,b:0,a:255}):(i=l,a={r:0,g:0,b:0,a:255});return}if(typeof l!="string")throw new ne(v,String(l));let w=nt(l);v==="fillStyle"?(r=l,o=w):(i=l,a=w)},O={get canvas(){return e.canvas},get fillStyle(){return r},set fillStyle(l){f(l,"fillStyle")},get strokeStyle(){return i},set strokeStyle(l){f(l,"strokeStyle")},get globalAlpha(){return d},set globalAlpha(l){d=gn(l)},get globalCompositeOperation(){return h},set globalCompositeOperation(l){if(l!=="source-over"&&l!=="copy")throw new ne("globalCompositeOperation",l);h=l},get lineWidth(){return y},set lineWidth(l){y=Number.isFinite(l)&&l>0?l:1},get lineCap(){return S},set lineCap(l){if(l!=="butt"&&l!=="round"&&l!=="square")throw new ne("lineCap",String(l));S=l},get font(){return g},set font(l){g=l},get textAlign(){return k},set textAlign(l){if(l!=="start"&&l!=="left"&&l!=="center"&&l!=="right"&&l!=="end")throw new ne("textAlign",String(l));k=l},get textBaseline(){return F},set textBaseline(l){F=l},get imageSmoothingEnabled(){return E},set imageSmoothingEnabled(l){E=!!l},imageSmoothingQuality:"low",lineJoin:"miter",miterLimit:10,lineDashOffset:0,shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0)",shadowOffsetX:0,shadowOffsetY:0,setGlyphAtlas(l){e.glyphAtlas=l},save(){n.push({transform:{...t},fillStyle:r,strokeStyle:i,fillStyleRaw:r,strokeStyleRaw:i,globalAlpha:d,globalCompositeOperation:h,lineWidth:y,lineCap:S,font:g,textAlign:k,textBaseline:F,clip:x?x.slice():null,imageSmoothingEnabled:E})},restore(){let l=n.pop();l&&(t=l.transform,r=l.fillStyleRaw,i=l.strokeStyleRaw,r instanceof ke?o={r:0,g:0,b:0,a:255}:o=nt(r),i instanceof ke?a={r:0,g:0,b:0,a:255}:a=nt(i),d=l.globalAlpha,h=l.globalCompositeOperation,y=l.lineWidth,S=l.lineCap,g=l.font,k=l.textAlign,F=l.textBaseline,x=l.clip,E=l.imageSmoothingEnabled)},beginPath(){V.length=0,U=null},closePath:b,moveTo:W,lineTo:p,rect(l,v,w,P){W(l,v),p(l+w,v),p(l+w,v+P),p(l,v+P),b()},quadraticCurveTo(l,v,w,P){let T=U?.points[U.points.length-1];if(!T){W(w,P);return}let L=tt(t,T.x,T.y);zr(L.x,L.y,l,v,w,P,16,(K,$)=>{U.points.push(c(K,$))})},bezierCurveTo(l,v,w,P,T,L){let K=U?.points[U.points.length-1];if(!K){W(T,L);return}let $=tt(t,K.x,K.y);qr($.x,$.y,l,v,w,P,T,L,24,(s,A)=>{U.points.push(c(s,A))})},arc(l,v,w,P,T,L=!1){if(w<0)throw new ne("arc","negative radius");let K=pn(l,v,w,P,T,L);if(K.length===0)return;let $=K[0];U?U.points.push(c($.x,$.y)):W($.x,$.y);for(let s=1;s<K.length;s++)U.points.push(c(K[s].x,K[s].y))},ellipse(l,v,w,P,T,L,K,$=!1){if(w<0||P<0)throw new ne("ellipse","negative radius");let s=pn(0,0,1,L,K,$),A=Math.cos(T),C=Math.sin(T);for(let D=0;D<s.length;D++){let N=s[D].x*w,J=s[D].y*P,X=l+N*A-J*C,z=v+N*C+J*A;D===0&&!U?W(X,z):p(X,z)}},fill(l="nonzero"){Y(xt(V),r,o,l)},stroke(){q(xt(V))},clip(l="nonzero"){let v=new Uint8Array(e.width*e.height),w=xt(V),P=It(w,e.width,e.height);if(P)for(let T=P.minY;T<=P.maxY;T++)for(let L=P.minX;L<=P.maxX;L++)ln(w,L+.5,T+.5,l)&&(v[T*e.width+L]=1);if(!x){x=v;return}for(let T=0;T<x.length;T++)x[T]=x[T]&&v[T]?1:0},fillRect(l,v,w,P){Y(M(l,v,w,P),r,o,"nonzero")},strokeRect(l,v,w,P){q(M(l,v,w,P))},clearRect(l,v,w,P){let T=e.alpha?{r:0,g:0,b:0,a:0}:{r:0,g:0,b:0,a:255};Y(M(l,v,w,P),"#000000",T,"nonzero","copy")},fillText(l,v,w){Z(String(l),v,w,r,o,!0)},strokeText(l,v,w){Z(String(l),v,w,i,a,!1)},measureText(l){return{width:fn(String(l),g,e.glyphAtlas)}},translate(l,v){t=et(t,{a:1,b:0,c:0,d:1,e:l,f:v})},rotate(l){let v=Math.cos(l),w=Math.sin(l);t=et(t,{a:v,b:w,c:-w,d:v,e:0,f:0})},scale(l,v){t=et(t,{a:l,b:0,c:0,d:v,e:0,f:0})},transform(l,v,w,P,T,L){t=et(t,{a:l,b:v,c:w,d:P,e:T,f:L})},setTransform(l,v,w,P,T,L){if(l&&typeof l=="object"){t={a:l.a,b:l.b,c:l.c,d:l.d,e:l.e,f:l.f};return}t={a:Number(l)||0,b:Number(v)||0,c:Number(w)||0,d:Number(P)||0,e:Number(T)||0,f:Number(L)||0}},resetTransform(){t={...Rt}},getTransform(){return{...t}},createLinearGradient(l,v,w,P){return new ke("linear",l,v,w,P)},createRadialGradient(l,v,w,P,T,L){if(w<0||L<0)throw new ne("createRadialGradient","negative radius");return new ke("radial",l,v,P,T,w,L)},createImageData(l,v){return typeof l=="object"?Se(new Uint8ClampedArray(l.width*l.height*4),l.width,l.height):Se(new Uint8ClampedArray(l*(v??0)*4),l,v??0)},getImageData(l,v,w,P){R();let T=l|0,L=v|0,K=w|0,$=P|0,s=new Uint8ClampedArray(K*$*4);for(let A=0;A<$;A++)for(let C=0;C<K;C++){let D=T+C,N=L+A,J=(A*K+C)*4;if(D<0||N<0||D>=e.width||N>=e.height)continue;let X=(N*e.width+D)*4;s[J]=e.pixels[X],s[J+1]=e.pixels[X+1],s[J+2]=e.pixels[X+2],s[J+3]=e.pixels[X+3]}return Se(s,K,$)},putImageData(l,v,w){R();let P=v|0,T=w|0,L=l.data;for(let K=0;K<l.height;K++)for(let $=0;$<l.width;$++){let s=P+$,A=T+K;if(s<0||A<0||s>=e.width||A>=e.height)continue;let C=(K*l.width+$)*4,D=(A*e.width+s)*4;e.pixels[D]=L[C],e.pixels[D+1]=L[C+1],e.pixels[D+2]=L[C+2],e.pixels[D+3]=e.alpha?L[C+3]:255}},drawImage(l,...v){let w=Ur(l),P=0,T=0,L=w.width,K=w.height,$,s,A,C;if(v.length===2)$=v[0],s=v[1],A=L,C=K;else if(v.length===4)$=v[0],s=v[1],A=v[2],C=v[3];else if(v.length===8)P=v[0],T=v[1],L=v[2],K=v[3],$=v[4],s=v[5],A=v[6],C=v[7];else throw new ne("drawImage","invalid argument count");u(),R();let D=[c($,s),c($+A,s),c($+A,s+C),c($,s+C)],N=Math.max(0,Math.floor(Math.min(...D.map(ee=>ee.x)))),J=Math.min(e.width-1,Math.ceil(Math.max(...D.map(ee=>ee.x)))),X=Math.max(0,Math.floor(Math.min(...D.map(ee=>ee.y)))),z=Math.min(e.height-1,Math.ceil(Math.max(...D.map(ee=>ee.y))));for(let ee=X;ee<=z;ee++)for(let ie=N;ie<=J;ie++){let ve=tt(t,ie+.5,ee+.5),xe=(ve.x-$)/A,Ce=(ve.y-s)/C;if(xe<0||Ce<0||xe>=1||Ce>=1)continue;let m=Math.floor(P+xe*L),I=Math.floor(T+Ce*K);if(m<0||I<0||m>=w.width||I>=w.height)continue;let H=(I*w.width+m)*4;te(ie,ee,{r:w.data[H],g:w.data[H+1],b:w.data[H+2],a:w.data[H+3]})}},setLineDash(l){if(l.length>0)throw new ne("setLineDash","non-empty dash")},getLineDash(){return[]},createPattern(){throw new ne("createPattern")}};function M(l,v,w,P){let T=c(l,v),L=c(l+w,v),K=c(l+w,v+P),$=c(l,v+P);return[{closed:!0,points:[T,L,K,$,T]}]}function Z(l,v,w,P,T,L){u();let K=e.glyphAtlas,$=yn(g),s=$/K.cellHeight,A=fn(l,g,K),C=v;k==="center"?C=v-A/2:(k==="right"||k==="end")&&(C=v-A);let D=w;F==="top"||F==="hanging"?D=w:F==="middle"?D=w-$/2:D=w-$;let N=C,J=(K.cellWidth+1)*s;for(let X of l){let z=K.glyphs[X]??K.glyphs[X.toUpperCase()];if(!z){N+=J;continue}for(let ee=0;ee<K.cellHeight;ee++)for(let ie=0;ie<K.cellWidth;ie++){if(z[ee*K.cellWidth+ie]===0)continue;if(!L){let se=ie===0||z[ee*K.cellWidth+ie-1]===0,he=ie===K.cellWidth-1||z[ee*K.cellWidth+ie+1]===0,we=ee===0||z[(ee-1)*K.cellWidth+ie]===0,Ze=ee===K.cellHeight-1||z[(ee+1)*K.cellWidth+ie]===0;if(!se&&!he&&!we&&!Ze)continue}let ve=N+ie*s,xe=D+ee*s,Ce=N+(ie+1)*s,m=D+(ee+1)*s,I=c(ve,xe),H=c(Ce,m),G=Math.max(0,Math.floor(Math.min(I.x,H.x))),j=Math.min(e.width-1,Math.ceil(Math.max(I.x,H.x))-1),Q=Math.max(0,Math.floor(Math.min(I.y,H.y))),le=Math.min(e.height-1,Math.ceil(Math.max(I.y,H.y))-1);for(let se=Q;se<=le;se++)for(let he=G;he<=j;he++)te(he,se,_(P,T,he,se))}N+=J}}return new Proxy(O,{get(l,v,w){if(Reflect.has(l,v))return Reflect.get(l,v,w);if(typeof v=="symbol")return;let P=String(v);if(!(P==="then"||P==="toJSON"))return(...T)=>{throw new ne(P)}},set(l,v,w,P){if(v==="shadowBlur"&&w)throw new ne("shadowBlur");if((v==="shadowOffsetX"||v==="shadowOffsetY")&&w)throw new ne(String(v));if(v==="filter"&&w&&w!=="none")throw new ne("filter",String(w));if(Reflect.has(l,v))return Reflect.set(l,v,w,P);throw new ne(String(v))}})}function Ur(e){if(e&&typeof e=="object"&&"__headlessImage"in e){let t=e;return{width:t.width,height:t.height,data:t.data}}if(e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e){let t=e;if(t.data instanceof Uint8ClampedArray)return{width:t.width,height:t.height,data:t.data}}if(typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement){let t=Te.get(e);if(!t)throw new ne("drawImage","source canvas has no headless surface");return{width:t.width,height:t.height,data:t.pixels}}throw new ne("drawImage","source must be ImageData, a headless canvas, or createImageFixture()")}function Br(e,t,n){if(e.kind==="linear"){let a=e.x1-e.x0,d=e.y1-e.y0,h=a*a+d*d,y=h===0?0:((t-e.x0)*a+(n-e.y0)*d)/h;return e.colorAt(y)}let r=Math.hypot(t-e.x1,n-e.y1),i=e.r1-e.r0,o=i===0?0:(r-e.r0)/i;return e.colorAt(o)}function $r(e,t,n){return{r:Math.round(e.r+(t.r-e.r)*n),g:Math.round(e.g+(t.g-e.g)*n),b:Math.round(e.b+(t.b-e.b)*n),a:Math.round(e.a+(t.a-e.a)*n)}}function et(e,t){return{a:e.a*t.a+e.c*t.b,b:e.b*t.a+e.d*t.b,c:e.a*t.c+e.c*t.d,d:e.b*t.c+e.d*t.d,e:e.a*t.e+e.c*t.f+e.e,f:e.b*t.e+e.d*t.f+e.f}}function tt(e,t,n){let r=e.a*e.d-e.b*e.c;if(r===0)return{x:t,y:n};let i=e.d/r,o=-e.b/r,a=-e.c/r,d=e.a/r,h=(e.c*e.f-e.d*e.e)/r,y=(e.b*e.e-e.a*e.f)/r;return{x:i*t+a*n+h,y:o*t+d*n+y}}function xt(e){return e.map(t=>({closed:t.closed,points:t.points.map(n=>({x:n.x,y:n.y}))}))}function It(e,t,n,r=0){let i=1/0,o=1/0,a=-1/0,d=-1/0;for(let h of e)for(let y of h.points)i=Math.min(i,y.x),o=Math.min(o,y.y),a=Math.max(a,y.x),d=Math.max(d,y.y);return Number.isFinite(i)?{minX:Math.max(0,Math.floor(i-r)),minY:Math.max(0,Math.floor(o-r)),maxX:Math.min(t-1,Math.ceil(a+r)),maxY:Math.min(n-1,Math.ceil(d+r))}:null}function ln(e,t,n,r){let i=0,o=0;for(let a of e){let d=a.points;if(!(d.length<2))for(let h=1;h<d.length;h++){let y=d[h-1],S=d[h],g=Gr(y.x,y.y,S.x,S.y,t,n);i+=g,g!==0&&(o+=1)}}return r==="evenodd"?o%2===1:i!==0}function Gr(e,t,n,r,i,o){if(t<=o==r<=o)return 0;let a=e+(o-t)/(r-t)*(n-e);return i<a?r>t?1:-1:0}function jr(e,t,n,r,i){for(let o of e){let a=o.points;for(let d=1;d<a.length;d++){let h=a[d-1],y=a[d];if(i==="round"){if(Wr(t,n,h.x,h.y,y.x,y.y)<=r)return!0;continue}let S=y.x-h.x,g=y.y-h.y,k=Math.hypot(S,g);if(k===0){if(Math.hypot(t-h.x,n-h.y)<=r)return!0;continue}let F=S/k,x=g/k,E=h.x,V=h.y,U=y.x,W=y.y;i==="square"&&(E-=F*r,V-=x*r,U+=F*r,W+=x*r);let p=U-E,b=W-V,c=p*p+b*b,u=((t-E)*p+(n-V)*b)/c;if(u<0||u>1)continue;let R=E+u*p,B=V+u*b;if(Math.hypot(t-R,n-B)<=r)return!0}}return!1}function Wr(e,t,n,r,i,o){let a=i-n,d=o-r,h=a*a+d*d;if(h===0)return Math.hypot(e-n,t-r);let y=((e-n)*a+(t-r)*d)/h;return y=y<0?0:y>1?1:y,Math.hypot(e-(n+y*a),t-(r+y*d))}function zr(e,t,n,r,i,o,a,d){for(let h=1;h<=a;h++){let y=h/a,S=1-y;d(S*S*e+2*S*y*n+y*y*i,S*S*t+2*S*y*r+y*y*o)}}function qr(e,t,n,r,i,o,a,d,h,y){for(let S=1;S<=h;S++){let g=S/h,k=1-g,F=k*k,x=g*g;y(F*k*e+3*F*g*n+3*k*x*i+x*g*a,F*k*t+3*F*g*r+3*k*x*o+x*g*d)}}function pn(e,t,n,r,i,o){let a=r,d=i;!o&&d<a&&(d+=Math.PI*2),o&&a<d&&(a+=Math.PI*2);let h=d-a,y=Math.max(8,Math.min(360,Math.ceil(Math.abs(h)*Math.max(n,1)))),S=[];for(let g=0;g<=y;g++){let k=a+h*g/y;S.push({x:e+Math.cos(k)*n,y:t+Math.sin(k)*n})}return S}function gn(e){return Number.isFinite(e)?e<0?0:e>1?1:e:1}function nt(e){let t=e.trim().toLowerCase(),r=Or[t]??t;if(r==="transparent")return{r:0,g:0,b:0,a:0};if(r[0]==="#"){let o=r.slice(1);if(o.length===3)return{r:parseInt(o[0]+o[0],16),g:parseInt(o[1]+o[1],16),b:parseInt(o[2]+o[2],16),a:255};if(o.length===6)return{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16),a:255};if(o.length===8)return{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16),a:parseInt(o.slice(6,8),16)}}let i=r.match(/^rgba?\(\s*([0-9.]+)\s*,\s*([0-9.]+)\s*,\s*([0-9.]+)(?:\s*,\s*([0-9.]+))?\s*\)$/);if(i)return{r:Tt(Number(i[1])),g:Tt(Number(i[2])),b:Tt(Number(i[3])),a:i[4]===void 0?255:Math.round(gn(Number(i[4]))*255)};throw new ne("fillStyle",e)}function Tt(e){return Number.isFinite(e)?e<0?0:e>255?255:Math.round(e):0}function yn(e){let t=e.match(/([0-9]+(?:\.[0-9]+)?)px/);return t?Number(t[1]):10}function fn(e,t,n){let r=yn(t)/n.cellHeight;return e.length*(n.cellWidth+1)*r}function Se(e,t,n){if(typeof ImageData=="function")try{return new ImageData(e,t,n)}catch{try{let r=new ImageData(t,n);return r.data.set(e),r}catch{}}return{data:e,width:t,height:n,colorSpace:"srgb"}}function bn(){let n={" ":new Uint8Array(35)},r={0:[14,17,19,21,25,17,14],1:[4,12,4,4,4,4,14],2:[14,17,1,2,4,8,31],3:[14,17,1,6,1,17,14],4:[2,6,10,18,31,2,2],5:[31,16,30,1,1,17,14],6:[14,16,30,17,17,17,14],7:[31,1,2,4,8,8,8],8:[14,17,17,14,17,17,14],9:[14,17,17,15,1,1,14],A:[14,17,17,31,17,17,17],B:[30,17,17,30,17,17,30],C:[14,17,16,16,16,17,14],D:[30,17,17,17,17,17,30],E:[31,16,16,30,16,16,31],F:[31,16,16,30,16,16,16],G:[14,17,16,23,17,17,14],H:[17,17,17,31,17,17,17],I:[14,4,4,4,4,4,14],K:[17,18,20,24,20,18,17],L:[16,16,16,16,16,16,31],M:[17,27,21,21,17,17,17],N:[17,25,21,19,17,17,17],O:[14,17,17,17,17,17,14],P:[30,17,17,30,16,16,16],R:[30,17,17,30,20,18,17],S:[15,16,16,14,1,1,30],T:[31,4,4,4,4,4,4],U:[17,17,17,17,17,17,14],V:[17,17,17,17,17,10,4],W:[17,17,17,21,21,21,10],Y:[17,17,10,4,4,4,4],Z:[31,1,2,4,8,16,31],".":[0,0,0,0,0,0,4],"-":[0,0,0,31,0,0,0],"+":[0,4,4,31,4,4,0],"*":[0,21,14,31,14,21,0],"!":[4,4,4,4,4,0,4],"?":[14,17,1,2,4,0,4],"/":[1,2,2,4,8,8,16],":":[0,4,0,0,0,4,0],"\u2713":[1,1,2,2,20,8,0]};for(let[i,o]of Object.entries(r)){let a=new Uint8Array(35);for(let d=0;d<7;d++)for(let h=0;h<5;h++)a[d*5+h]=o[d]&1<<4-h?1:0;n[i]=a,n[i.toLowerCase()]=a}return{cellWidth:5,cellHeight:7,glyphs:n}}var vn=new Uint32Array(256);for(let e=0;e<256;e++){let t=e;for(let n=0;n<8;n++)t=t&1?3988292384^t>>>1:t>>>1;vn[e]=t>>>0}function Yr(e){let t=4294967295;for(let n=0;n<e.length;n++)t=vn[(t^e[n])&255]^t>>>8;return(t^4294967295)>>>0}function Jr(e){let t=1,n=0;for(let r=0;r<e.length;r++)t=(t+e[r])%65521,n=(n+t)%65521;return(n<<16|t)>>>0}function $e(e){return new Uint8Array([e>>>24&255,e>>>16&255,e>>>8&255,e&255])}function Pt(e,t){let n=new Uint8Array(8+t.length+4);n.set($e(t.length),0),n[4]=e.charCodeAt(0),n[5]=e.charCodeAt(1),n[6]=e.charCodeAt(2),n[7]=e.charCodeAt(3),n.set(t,8);let r=n.subarray(4,8+t.length);return n.set($e(Yr(r)),8+t.length),n}function Xr(e){let t=[];for(let a=0;a<e.length;a+=65535){let d=e.subarray(a,Math.min(a+65535,e.length)),h=a+65535>=e.length,y=new Uint8Array(5+d.length);y[0]=h?1:0,y[1]=d.length&255,y[2]=d.length>>>8&255;let S=~d.length&65535;y[3]=S&255,y[4]=S>>>8&255,y.set(d,5),t.push(y)}t.length===0&&t.push(new Uint8Array([1,0,0,255,255]));let r=t.reduce((a,d)=>a+d.length,0),i=new Uint8Array(2+r+4);i[0]=120,i[1]=1;let o=2;for(let a of t)i.set(a,o),o+=a.length;return i.set($e(Jr(e)),o),i}function Pe(e,t,n){let r=e*4,i=new Uint8Array(t*(1+r));for(let g=0;g<t;g++){let k=g*(1+r);i[k]=0,i.set(n.subarray(g*r,(g+1)*r),k+1)}let o=new Uint8Array(13);o.set($e(e),0),o.set($e(t),4),o[8]=8,o[9]=6;let a=new Uint8Array([137,80,78,71,13,10,26,10]),d=[Pt("IHDR",o),Pt("IDAT",Xr(i)),Pt("IEND",new Uint8Array(0))],h=a.length+d.reduce((g,k)=>g+k.length,0),y=new Uint8Array(h);y.set(a,0);let S=a.length;for(let g of d)y.set(g,S),S+=g.length;return y}function De(e,t,n){let r=Pe(e,t,n),i="";for(let o=0;o<r.length;o++)i+=String.fromCharCode(r[o]);return`data:image/png;base64,${globalThis.btoa(i)}`}function Vt(e){let t=[137,80,78,71,13,10,26,10];for(let y=0;y<8;y++)if(e[y]!==t[y])throw new ne("decodePng","invalid signature");let n=0,r=0,i=[],o=8;for(;o<e.length;){let y=e[o]<<24|e[o+1]<<16|e[o+2]<<8|e[o+3],S=String.fromCharCode(e[o+4],e[o+5],e[o+6],e[o+7]),g=e.subarray(o+8,o+8+y);if(S==="IHDR"){if(n=g[0]<<24|g[1]<<16|g[2]<<8|g[3],r=g[4]<<24|g[5]<<16|g[6]<<8|g[7],g[8]!==8||g[9]!==6)throw new ne("decodePng","only 8-bit RGBA is supported")}else if(S==="IDAT")for(let k=0;k<g.length;k++)i.push(g[k]);else if(S==="IEND")break;o+=12+y}let a=Qr(new Uint8Array(i)),d=n*4,h=new Uint8ClampedArray(n*r*4);for(let y=0;y<r;y++){let S=y*(1+d);if(a[S]!==0)throw new ne("decodePng",`unsupported scanline filter ${a[S]}`);h.set(a.subarray(S+1,S+1+d),y*d)}return Se(h,n,r)}function Qr(e){if(e.length<6)throw new ne("decodePng","truncated zlib");let t=[],n=2;for(;n<e.length-4;){let a=e[n]&1;if((e[n]>>>1&3)!==0)throw new ne("decodePng","only stored deflate blocks are supported");n+=1;let h=e[n]|e[n+1]<<8;if(n+=4,t.push(e.subarray(n,n+h)),n+=h,a)break}let r=t.reduce((a,d)=>a+d.length,0),i=new Uint8Array(r),o=0;for(let a of t)i.set(a,o),o+=a.length;return i}function rt(e){let t=e.indexOf(","),n=t>=0?e.slice(t+1):e,r=globalThis.atob(n),i=new Uint8Array(r.length);for(let o=0;o<r.length;o++)i[o]=r.charCodeAt(o);return i}function Sn(){if(!cn){cn=!0;for(let e of["width","height"]){let t=Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype,e);if(!t?.set||!t.get)continue;let n=t.set;Object.defineProperty(HTMLCanvasElement.prototype,e,{configurable:!0,enumerable:t.enumerable,get:t.get,set(r){n.call(this,r);let i=Te.get(this);i&&(i.resize(this.width,this.height,!0),i.onDeviceReset?.())}})}}}var En=()=>{let e=["ms","moz","webkit","o"];for(let t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"]},fe=window.devicePixelRatio||1,Me=/Headless/i.test(navigator.userAgent),ds=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)||/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform);function An(){return Math.min(window.innerWidth,window.innerHeight)}var Ft="data-cyberart-canvas",Le=class{constructor(t,n,r=1,i={}){this.width=t,this.height=n;let o=i.container,a=i.adoptFromDocument??!o,d=o?o.querySelector(`canvas[${Ft}]`)??o.querySelector("canvas"):null;if(d)this.canvas=d,this.adopted=!0;else if(a){let h=document.getElementById("canvas")??document.querySelector("canvas");h?(this.canvas=h,this.adopted=!0):(this.canvas=document.createElement("canvas"),this.canvas.setAttribute("id","canvas"),this.adopted=!1)}else this.canvas=document.createElement("canvas"),this.adopted=!1;this.canvas.hasAttribute(Ft)||this.canvas.setAttribute(Ft,""),this.canvas.style.display="block",this.canvas.style.margin="auto",this.ctx=this.canvas.getContext("2d",{colorSpace:"display-p3",alpha:!1}),this.ctx.globalAlpha=r,this.ctx.imageSmoothingEnabled=!1,this.setSize(t,n)}setSize(t,n){this.width=t,this.height=n,this.canvas.width=t,this.canvas.height=n,this.canvas.style.width=`${t/fe}px`,this.canvas.style.height=`${n/fe}px`,this.imageData=this.ctx.createImageData(t,n),this.ctx.putImageData(this.imageData,0,0)}_blank(t=1){let n=t?Math.max(t,.03):1;this.ctx.fillStyle=`rgba(0,0,0,${n})`,this.ctx.fillRect(0,0,this.width,this.height)}clearAll(){this.ctx.save(),this.ctx.globalAlpha=1,this._blank(),this.ctx.restore()}};function Cn(e,t){let n=e/t,r,i;return n>1?(r=e,i=~~(e/n)):(i=t,r=~~(t*n)),{width:r,height:i,iWidth:1/r,iHeight:1/i,area:r*i,largeDim:Math.max(r,i),smallDim:Math.min(r,i),aspectRatio:n}}function wn(e,t=window.innerWidth,n=window.innerHeight){let r=An(),i,o;return n<t?e>1?t>=r*e?(i=r*e,o=r):(i=t,o=i/e):(i=r*e,o=r):e>1?(i=r,o=r/e):n<r/e?(o=n,i=o*e):(i=r,o=r/e),[i,o]}var Ht=class{constructor(t=!1,n=!0){this.debugMode=t,this.actionMap={},this.listening=n,this.checkKeypress=this.checkKeypress.bind(this),this.registerAction=this.registerAction.bind(this),this.listening&&window.addEventListener("keydown",this.checkKeypress,!1)}checkKeypress({key:t}){this.debugMode&&console.log(`Pressed ${t}`),t in this.actionMap&&this.actionMap[t]()}inject(t){this.checkKeypress({key:t})}registerAction(t,n,r=!1){if(t.length!==1)throw new Error(`Only single-character actions may be registered. Cannot register: ${t}`);if(t in this.actionMap&&!r)throw new Error(`Action already exists for code: ${t}`);this.actionMap[t]=n}destroy(){this.listening&&window.removeEventListener("keydown",this.checkKeypress,!1),this.actionMap={}}},kn=Ht;var Ot=class{constructor(t,n={}){this.x=-1;this.y=-1;this.isDown=!1;this.clicks=[];this.canvas=t,this.listening=n.listen!==!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.listening&&(t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("pointermove",this.onPointerMove),t.addEventListener("pointerup",this.onPointerUp))}toCanvasCoords(t){let n=this.canvas.getBoundingClientRect();return{x:(t.clientX-n.left)*(this.canvas.width/n.width),y:(t.clientY-n.top)*(this.canvas.height/n.height)}}onPointerDown(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!0,this.clicks.push({x:n,y:r})}onPointerMove(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r}onPointerUp(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!1}hasClick(){return this.clicks.length>0}consumeClick(){return this.clicks.shift()??null}inject(t,n,r){this.x=n,this.y=r,t==="down"?(this.isDown=!0,this.clicks.push({x:n,y:r})):t==="up"&&(this.isDown=!1)}destroy(){this.listening&&(this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp))}},Rn=Ot;function it(){return{now:()=>performance.now()}}function xn(e=0){let t=e;return{now:()=>t,set(n){t=n},advance(n){t+=n}}}var In=(e,t,n,r)=>({now:e,startTime:t,elapsedSinceStart:e-t,deltaSinceLastUpdate:n===null?0:e-n,deltaSinceLastRender:r===null?0:e-r}),ot=class{constructor(t,n,r,i,o,a={}){this.startTime=0;this.lastUpdateAt=null;this.lastRenderAt=null;this.clockOffsetMs=0;this.pauseStartedAt=null;this.renderAnimation=this.renderAnimation.bind(this),this.dimensionContext=Cn(t,n),this.R=r,this.gameManager=a.gameManager,this.hostChannel=a.hostChannel,this.clock=a.clock??it(),this.kind=a.kind??"render",this.keyboardManager=new kn(!1,a.captureKeyboard??!0),this.kind!=="calculation"&&(this.canvas=new Le(this.dimensionContext.width,this.dimensionContext.height,1,a.canvasMount),this.drawingContext=this.canvas.ctx,this.pointerManager=new Rn(this.canvas.canvas,{listen:a.listenToPointer!==!1})),this.animationCart=o;let d=a.customState;this.featureState=o.getDefaultFeatureState?.(this.R,this.dimensionContext,i,this.keyboardManager,d,this.pointerManager,this.gameManager,this.hostChannel),this.cartState=o.getDefaultState(this.R,this.dimensionContext,i,this.keyboardManager,d,this.pointerManager,this.gameManager,this.featureState,this.hostChannel),this.startTime=this.clock.now(),this.canvas?.clearAll()}captureFramebuffer(){let t=this.canvas?.imageData;if(!t)return new ImageData(this.dimensionContext.width,this.dimensionContext.height);let n=new ImageData(t.width,t.height);return n.data.set(t.data),n}restoreFramebuffer(t){let n=this.canvas?.imageData,r=this.drawingContext;return!n||!r||n.width!==t.width||n.height!==t.height||n.data.length!==t.data.length?!1:(n.data.set(t.data),r.putImageData(n,0,0),!0)}setPaused(t){let n=this.clock.now();if(t){this.pauseStartedAt===null&&(this.pauseStartedAt=n);return}this.pauseStartedAt!==null&&(this.clockOffsetMs+=n-this.pauseStartedAt,this.pauseStartedAt=null)}resolveNow(t){let n=this.pauseStartedAt!==null?t-this.pauseStartedAt:0;return t-this.clockOffsetMs-n}getElapsedSinceStart(t=this.clock.now()){return Math.max(0,this.resolveNow(t)-this.startTime)}restoreClock(t,n){this.pauseStartedAt=null,this.lastUpdateAt=null,this.lastRenderAt=null;let r=Math.max(0,t);if(typeof n=="number"&&Number.isFinite(n)){this.startTime=n,this.clockOffsetMs=this.clock.now()-n-r;return}this.clockOffsetMs=0,this.startTime=this.clock.now()-r}getRandomState(){return this.R.getState()}injectKey(t){this.keyboardManager.inject(t)}injectPointer(t,n,r){this.pointerManager?.inject(t,n,r)}async updateAnimationState(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=In(i,this.startTime,this.lastUpdateAt,this.lastRenderAt);this.cartState=this.animationCart.update(this.R,t,n,this.dimensionContext,this.cartState,this.keyboardManager,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastUpdateAt=i}async renderAnimation(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=In(i,this.startTime,this.lastUpdateAt,this.lastRenderAt),a=this.drawingContext,d=this.canvas?.imageData;this.kind!=="calculation"&&this.animationCart.render&&a&&d&&this.animationCart.render(this.R,t,n,this.dimensionContext,this.cartState,a,d,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastRenderAt=i}getCanvas(){return this.canvas?.canvas}getDrawDetails(){let t=this.canvas?.canvas;if(!t)throw new Error("calculation cart has no canvas");return[t,0,0,this.dimensionContext.width,this.dimensionContext.height]}teardown(){try{this.animationCart.teardown?.(this.cartState,this.featureState)}catch(t){console.error("Error during cart teardown",t)}this.keyboardManager.destroy(),this.pointerManager?.destroy()}};var st=class extends Le{constructor(t,n,r=1,i=!0,o={}){if(super(t,n,r,o),this.adopted)return;let a=o.container;if(a){this.canvas.parentNode!==a&&a.appendChild(this.canvas);return}if(i){let d=document.getElementById("canvas");d&&d!==this.canvas&&d.parentNode===document.body&&document.body.removeChild(d),document.body.appendChild(this.canvas)}}};function Tn(e){let t=parseInt(e.substring(0,8),16),n=parseInt(e.substring(8,8),16),r=parseInt(e.substring(16,8),16),i=parseInt(e.substring(24,8),16);return{next:()=>{t|=0,n|=0,r|=0,i|=0;let a=(t+n|0)+i|0;return i=i+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+a|0,(a>>>0)/4294967296},getRegs:()=>({a:t,b:n,c:r,d:i}),setRegs:a=>{t=a.a,n=a.b,r=a.c,i=a.d}}}var at=class{constructor(t){this.seed=t.hash,this.useA=!1,this.genA=Tn(t.hash.substring(2,32)),this.genB=Tn(t.hash.substring(34,32)),this.prngA=this.genA.next,this.prngB=this.genB.next;for(let n=0;n<1e6;n+=2)this.prngA(),this.prngB()}getState(){let t=this.genA.getRegs(),n=this.genB.getRegs();return{seed:this.seed,useA:this.useA,prngA:{a:t.a,b:t.b,c:t.c,d:t.d},prngB:{a:n.a,b:n.b,c:n.c,d:n.d}}}setState(t){if(t.seed!==this.seed)throw new Error(`Random.setState: seed ${t.seed} does not match ${this.seed}`);this.useA=t.useA,this.genA.setRegs(t.prngA),this.genB.setRegs(t.prngB)}r_zero_one(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}dec(t,n){return t===void 0?this.r_zero_one():n===void 0?t*this.r_zero_one():t+(n-t)*this.r_zero_one()}int(t,n){return n===void 0&&(n=t,t=0),Math.floor(this.dec(t,n))}bool(t=.5){return this.r_zero_one()<t}sign(){return this.bool()?1:-1}choose(t){return t[this.int(t.length)]}};var Mn="bafybeicjwcq5lxxtfnyj4p2ugcr7ctyb5wl62cbcechj6tsabdq5whcs7u",Pn="https://ipfs.io/ipfs/";function Zr(e){return e.endsWith("/")?e:`${e}/`}var Ge=null;function ei(e){return[...Array(e)].map(()=>Math.floor(Math.random()*16).toString(16)).join("")}function ti(e){return e&&e.length>0?e:[{cid:Mn}]}function ni(e){return e.startsWith("0x")?e:`0x${e}`}var Ln=/^(0[xX])?[0-9a-fA-F]{64}$/;function ri(e){let t="",n=2166136261,r=522970236;for(let i=0;t.length<64;i++){for(let o=0;o<e.length;o++)n^=e.charCodeAt(o)+i,n=Math.imul(n,16777619),r^=e.charCodeAt(o)+i*17,r=Math.imul(r,16777619);t+=(n>>>0).toString(16).padStart(8,"0"),t+=(r>>>0).toString(16).padStart(8,"0")}return`0x${t.slice(0,64)}`}function Dn(e){let t=typeof e=="number"?String(e):e;return Ln.test(t)?`0x${(t.startsWith("0x")||t.startsWith("0X")?t.slice(2):t).toLowerCase()}`:ri(t)}function Vn(e,t){if(typeof e=="number"||t==="deterministic")return Dn(e);let n=String(e);return Ln.test(n)?Dn(n):n.startsWith("0x")||n.startsWith("0X")?n:`0x${n}`}function ii(e){if(!e&&typeof tokenData<"u"&&tokenData?.hash)return{hash:tokenData.hash,tokenId:String(tokenData.tokenId),externalAssetDependencies:ti(tokenData.externalAssetDependencies),preferredIPFSGateway:Zr(tokenData.preferredIPFSGateway||Pn),preferredArweaveGateway:tokenData.preferredArweaveGateway};let t=typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams;return{hash:e?ni(e):t.get("hash")||`0x${ei(64)}`,tokenId:"18009999",externalAssetDependencies:[{cid:Mn}],preferredIPFSGateway:Pn}}function _t(e){let t=e?.useCache!==!1;if(t&&Ge&&!e?.hash)return Ge;let n=ii(e?.hash);return t?Ge=n:Ge||(Ge=n),n}function Fn(e){return new Array(32).fill(null).map((t,n)=>parseInt(e.hash.slice(2+n*2,4+n*2),16))}Ut();var pt="$cyberartTa",de=class extends Error{constructor(t){super(t),this.name="IncompatibleCartStateError"}},Bt={Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array};function di(e){for(let t of Object.keys(Bt))if(e instanceof Bt[t])return t}function Bn(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function ge(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function $t(e){return ge(e)?typeof e[pt]=="string"&&Array.isArray(e.d):!1}function ui(e){return e==null?!1:typeof e=="function"?!0:!(typeof e!="object"||Array.isArray(e)||Bn(e)||ge(e))}var ci=new Set(["audioContextStarted","midiSynths","keepRatioPrimed","audioInitStarted","musicSeekApplied"]);function Kn(e){return e===null?"null":$t(e)?String(e[pt]):Array.isArray(e)?"array":ge(e)?"object":typeof e}function li(e,t){return e===t||e==="null"||t==="null"}function Un(e){return e.trim().toLowerCase().replace(/^0x/,"")}function $n(e,t,n,r){if(!(!n&&!r)&&Un(e)!==Un(t))throw new de(`Generative cart state is for seed "${t}", but the live token is "${e}"`)}function Ve(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Gn(e,t){let n=e.dimensions;if(n&&Ve(n.width)&&Ve(n.height))return n;if(t&&Ve(t.width)&&Ve(t.height))return{width:t.width,height:t.height};if(ge(e.state)){let r=e.state.containerWidth,i=e.state.containerHeight;if(Ve(r)&&Ve(i))return{width:r,height:i}}return null}function Fe(e,t=new WeakSet){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:null;if(!(typeof e=="function"||typeof e>"u"||typeof e=="bigint"||typeof e=="symbol")){if(Bn(e)){let n=di(e);return n?{[pt]:n,d:Array.from(e)}:void 0}if(typeof e=="object"&&!t.has(e)){t.add(e);try{if(Array.isArray(e)){let i=[],o=0;for(let a of e){let d=Fe(a,t);d!==void 0&&(i.push(d),o++)}return e.length>0&&o===0?void 0:i}if(!ge(e)||ui(e))return;let n=Object.keys(e),r={};for(let i of n){if(ci.has(i))continue;let o=Fe(e[i],t);o!==void 0&&(r[i]=o)}return n.length>0&&Object.keys(r).length===0?void 0:r}finally{t.delete(e)}}}}function We(e){if($t(e)){let t=Bt[e[pt]];return t?new t(e.d.map(n=>Number(n))):e}if(Array.isArray(e))return e.map(t=>We(t));if(ge(e)){let t={};for(let n of Object.keys(e))t[n]=We(e[n]);return t}return e}function Gt(e,t,n,r,i=!0){if(i&&n&&r&&n!==r)throw new de(`Cart state is for "${r}", but the live cart is "${n}"`);if(!ge(t)){if(i)throw new de("Cart state snapshot is empty");return}let o=Object.keys(t);if(o.length===0){if(i)throw new de("Cart state snapshot is empty");return}let a=Fe(e);if(!ge(a)||Object.keys(a).length===0){if(i)throw new de("Live cart has no serializable state");return}let d=o.filter(h=>h in a);if(d.length===0){if(i)throw new de("Cart state snapshot does not overlap the live cart shape");return}for(let h of d){let y=Kn(a[h]),S=Kn(t[h]);if(!li(y,S))throw new de(`Cart state field "${h}" has type ${S}, live cart expects ${y}`);if(y==="object"){let g=t[h],k=e[h];ge(g)&&!$t(g)&&Gt(k,g,void 0,void 0,!1)}}}function jn(e,t){if(!ge(e)||!ge(t))return;let n=Fe(e);if(ge(n))for(let r of Object.keys(t))r in n&&(e[r]=We(t[r]))}function ye(e){let t=typeof e=="string"?JSON.parse(e):e;if(!t||typeof t!="object")throw new de("Cart state bundle is not an object");if(t.version!==1)throw new de(`Unsupported cart state version ${String(t.version)}`);if(typeof t.seed!="string"||typeof t.framesElapsed!="number")throw new de("Cart state bundle is missing seed or framesElapsed");return t}var Ee="cyberart.asset.ready",Ae="cyberart.asset.failed";function Re(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Wn(e){return{type:e.status==="ready"?Ee:Ae,kind:"state",payload:e.detail===void 0?{id:e.id}:{id:e.id,detail:e.detail}}}function fi(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.startTime=="number"&&typeof t.lastSimulationUpdateAt=="number"?Math.max(0,t.lastSimulationUpdateAt-t.startTime):0}function mi(e,t){if(typeof window.resizeTo!="function")return!1;try{if(window.top!==window)return!1}catch{return!1}let n=Math.max(1,Math.round(e)),r=Math.max(1,Math.round(t)),i=Math.max(0,window.outerWidth-window.innerWidth),o=Math.max(0,window.outerHeight-window.innerHeight);try{window.resizeTo(n+i,r+o)}catch{return!1}return Math.abs(window.innerWidth-n)<=8&&Math.abs(window.innerHeight-r)<=8}var hi=[[0,0],[16,9],[9,16],[4,3],[3,4],[2,1],[1,2],[3,1],[1,3],[1,1]],Wt=hi[0],gi=Wt[0]/Wt[1],jt=30,yi=120,bi=3840/2160,vi=2160/3840,ft=class{constructor(t=jt,n=!1,r=window.innerWidth,i=window.innerHeight,o=!0,a,d={}){this.framesElapsed=0;this.frameRate=jt;this._paused=!1;this.savedToken=!1;this.prepared=!1;this.loopRunning=!1;this.fallbackAudio=[];this.audioLibrariesInternal=[];this.virtualClock=null;this.scriptedActions=[];this.initialScriptedActions=[];this.appliedActions=[];this.consumedActionIndexes=new Set;this.outboundEvents=[];this.consecutiveErrorCount=0;this.lastErrorLogAt=0;this.reinitStayPaused=!1;this.reinitPending=!1;this.lastExportedFramebuffer=null;this.pinnedOutput=null;this.pinViewportAtImport=null;this.importing=!1;this.drawLoop=this.drawLoop.bind(this),this.loadCart=this.loadCart.bind(this),this.prepareCart=this.prepareCart.bind(this),this.beginPlayback=this.beginPlayback.bind(this),this.reinit=this.reinit.bind(this),this.tuneFramerate=this.tuneFramerate.bind(this),this.container=d.container,this.seed=d.seed,this.captureKeyboard=d.captureKeyboard??!0,this.customState=d.customState,this.hostChannel=d.hostChannel,this.fallbackAudio=ct(d.audio),this.audioLibrariesInternal=this.fallbackAudio,this.kind=d.kind??"render";let h=d.deterministic;this.deterministic=!!h;let y=h&&typeof h=="object"?h:{};if(this.deterministic){if(d.clock){let S=d.clock;if(typeof S.advance!="function")throw new Error("deterministic mode requires a virtual clock with advance()");this.virtualClock=S,this.clock=S}else this.virtualClock=xn(y.origin??0),this.clock=this.virtualClock;this.initialScriptedActions=Re(y.actions??[]),this.scriptedActions=Re(this.initialScriptedActions)}else this.clock=d.clock??it();this.isBodyCanvas=this.container?!1:o,this.autoMode=n,this.aspectRatio=gi,this.selectedAsp=Wt,this.isFullscreen=!!document.fullscreenElement,this.updateFrameRate(t),this.tempUnpause=!1,this.synchronous=Me,this.containerWidth=r,this.containerHeight=i,this.gameManager=a,this.init(!0)}setGameManager(t){this.gameManager=t}reinit(t){if(!this.importing){if(this.shouldKeepPinnedOutput()){this.fitPinnedCanvas();return}this.reinitPending||(this.reinitStayPaused=this._paused,this.reinitPending=!0),this.paused=!0,clearTimeout(this.reinitTimeout),this.reinitTimeout=setTimeout(()=>{if(this.importing){this.paused=this.reinitStayPaused,this.reinitPending=!1;return}this.updateInProgress?this.reinit(t):(this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.clearPinnedOutput(),this.init(),this.reloadCart(),this.paused=this.reinitStayPaused,this.reinitPending=!1)},150)}}initSeed(){this.tokenData=this.seed?_t({hash:this.seed,useCache:!1}):_t(),this.rawParams=Fn(this.tokenData),this.mintNo=parseInt(this.tokenData.tokenId)%1e6,console.log("token",this.mintNo,this.tokenData.hash)}init(t=!1){t&&this.initSeed(),this.pureAspectUpdate(this.selectedAsp);let n=this.aspectRatio,[r,i]=wn(n,this.containerWidth,this.containerHeight);r*=fe,i*=fe,this.width=~~r,this.height=~~i,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.kind!=="calculation"&&(this.mainCanvas?this.mainCanvas.setSize(this.width,this.height):this.mainCanvas=new st(this.width,this.height,1,this.isBodyCanvas,this.canvasMountOptions()))}loadCart(t){this.prepareCart(t)&&this.beginPlayback()}prepareCart(t){if(this.prepared)return!0;try{let n=~~(this.width/1),r=~~(this.height/this.width*n),i=new at(this.tokenData),o=new ot(n,r,i,this.rawParams,t,{gameManager:this.gameManager,canvasMount:this.canvasMountOptions(),customState:this.customState,captureKeyboard:this.deterministic?!1:this.captureKeyboard,hostChannel:this.hostChannel,clock:this.clock,listenToPointer:!this.deterministic,kind:this.kind});return this.animation=o,this.animationCart=t,this.paused=!1,this.framesElapsed=0,this.outboundEvents=[],this.scriptedActions=Re(this.initialScriptedActions),this.appliedActions=[],this.consumedActionIndexes=new Set,this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.deterministic&&this.hostChannel&&(this.outboundUnsubscribe=this.hostChannel.onEvent(a=>{this.outboundEvents.push(a)})),this.R=i,this.applyCartFrameRate(t,o),this.resolveAudioLibraries(t),this.prepared=!0,!0}catch(n){return console.error(n),!1}}applyCartFrameRate(t,n){let r=t.metadata,i=r?.frameRate??jt,o=n.cartState?.visualMode??n.featureState?.visualMode,a=o&&r?.frameRateByVisualMode?r.frameRateByVisualMode[o]:void 0;this.updateFrameRate(typeof a=="number"&&a>0?a:i)}get audioLibraries(){return this.audioLibrariesInternal}get needsAudio(){return this.audioLibrariesInternal.length>0}resolveAudioLibraries(t){this.audioLibrariesInternal=ct(t.metadata?.audio)}async unlockAudio(){if(this.audioLibrariesInternal.length===0)return;let t=lt(this.audioLibrariesInternal);if(Me){for(let n of t)await n.load();return}for(let n of t)await n.unlock()}async resumeAudioLibraries(){if(!(this.paused||Me))for(let t of lt(this.audioLibrariesInternal))try{await t.resumeIfSuspended()}catch(n){console.error(`Failed to resume audio library "${t.id}" after reload`,n)}}beginPlayback(){!this.prepared||this.loopRunning||(this.prepared=!1,this.loopRunning=!0,this.consecutiveErrorCount=0,!this.deterministic&&(this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)))}get isPrepared(){return this.prepared}get isLoopRunning(){return this.loopRunning}get isDeterministic(){return this.deterministic}getClock(){return{now:this.clock.now(),framesElapsed:this.framesElapsed,frameRate:this.frameRate}}getRandomState(){return this.requirePreparedAnimation().getRandomState()}schedule(t){this.scriptedActions.push(Re(t))}async getReplayMetadata(){let t=await this.exportState();return{seed:this.tokenData.hash,clock:this.getClock(),rng:this.getRandomState(),actions:Re(this.scriptedActions),applied:Re(this.appliedActions),events:Re(this.outboundEvents),state:t.state}}async step(t=1){if(!this.deterministic)throw new Error("step() requires createRuntime({ deterministic: true })");this.requirePreparedAnimation(),this.prepared&&!this.loopRunning&&this.beginPlayback(),this.paused=!1;let n=Math.max(0,Math.floor(t));for(let r=0;r<n&&this.animation;r++){let i=this.framesElapsed;if(this.applyScheduledActions(i),await this.processFrame(this.clock.now(),{ignorePause:!0,scheduleNext:!1}),this.framesElapsed===i||(this.virtualClock?.advance(this.targetDrawTime),!this.loopRunning))break}}async advance(t){let n=Math.max(0,Math.round(t/this.targetDrawTime));await this.step(n)}applyScheduledActions(t){let n=this.animation;n&&this.scriptedActions.forEach((r,i)=>{r.atFrame===t&&(this.consumedActionIndexes.has(i)||(this.consumedActionIndexes.add(i),r.type==="pointer"?n.injectPointer(r.pointer.kind,r.pointer.x,r.pointer.y):r.type==="key"?n.injectKey(r.key):r.type==="event"?this.hostChannel?.dispatch(r.event):r.type==="asset"&&this.hostChannel?.dispatch(Wn(r)),this.appliedActions.push({frame:t,action:r})))})}get paused(){return this._paused}set paused(t){this._paused!==t&&(this._paused=t,this.animation?.setPaused(t))}async waitUntilUpdateIdle(){for(;this.updateInProgress;)await new Promise(t=>{this.deterministic?queueMicrotask(t):typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>t()):setTimeout(t,0)})}requirePreparedAnimation(){if(!this.animation)throw new Error("No prepared cart");return this.animation}async exportState(){let t=this.requirePreparedAnimation(),n=this._paused;this.paused=!0,await this.waitUntilUpdateIdle();try{this.kind!=="calculation"?this.lastExportedFramebuffer=t.captureFramebuffer():this.lastExportedFramebuffer=null;let r=t.getCanvas();return{version:1,cartId:this.animationCart?.metadata?.id,generative:this.animationCart?.metadata?.generative,seed:this.tokenData.hash,framesElapsed:this.framesElapsed,elapsedSinceStart:t.getElapsedSinceStart(),dimensions:{width:r?.width??this.width,height:r?.height??this.height,cssWidth:this.containerWidth,cssHeight:this.containerHeight,dpr:fe},state:Fe(t.cartState)}}finally{this.paused=n}}async exportStateJSON(){return JSON.stringify(await this.exportState())}peekExportedFramebuffer(){return this.lastExportedFramebuffer}peekSeed(){return this.tokenData?.hash}isGenerative(){return this.animationCart?.metadata?.generative===!0}async importState(t,n){let r=this.requirePreparedAnimation(),i=ye(t),o=this._paused,a=this.loopRunning;this.paused=!0,await this.waitUntilUpdateIdle(),Gt(r.cartState,i.state,this.animationCart?.metadata?.id,i.cartId),$n(this.tokenData.hash,i.seed,this.animationCart?.metadata?.generative,i.generative),clearTimeout(this.reinitTimeout),this.reinitPending=!1,this.importing=!0;let d=Gn(i,n?.framebuffer??this.lastExportedFramebuffer);if(d){this.pinOutputSize(d);let S=d.cssWidth??d.width/fe,g=d.cssHeight??d.height/fe;mi(S,g),this.syncContainerFromDom(),this.pinViewportAtImport={w:this.containerWidth,h:this.containerHeight}}let h=this.customState,y=!1;try{if(this.customState=We(i.state),this.unloadCart(),!this.prepareCart(this.animationCart))throw new Error("Failed to prepare cart while loading state");this.animation.cartState!==this.customState&&jn(this.animation.cartState,i.state),this.framesElapsed=i.framesElapsed;let S=this.animation,g=S.cartState,k=typeof i.elapsedSinceStart=="number"?i.elapsedSinceStart:fi(g);S.restoreClock(k,typeof g?.startTime=="number"?g.startTime:void 0),o&&S.setPaused(!0);let F=n?.framebuffer??this.lastExportedFramebuffer;this.kind!=="calculation"&&(F&&S.restoreFramebuffer(F)?g.keepRatioPrimed=!0:await S.renderAnimation(this.framesElapsed,this.rawParams)),this.fitPinnedCanvas(),y=!0}catch(S){throw this.clearPinnedOutput(),this.customState=h,this.paused=o,this.animationCart&&(this.syncContainerFromDom(),this.init(),this.reloadCart()),S}finally{this.importing=!1,y&&(this.customState=h,this.paused=o,a&&this.beginPlayback())}}unloadCart(){this.loopRunning=!1,this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.drawLoopTimeout&&clearTimeout(this.drawLoopTimeout),this.animation?.teardown(),this.animation=void 0,this.prepared=!1,this.audioLibrariesInternal=this.fallbackAudio,this.mainCanvas?.clearAll()}reloadCart(t=!1){let n=this.animationCart;if(!n)return;this.pinnedOutput&&(this.clearPinnedOutput(),this.syncContainerFromDom(),this.init());let r=this.reinitPending?this.reinitStayPaused:this._paused;this.unloadCart(),t&&this.initSeed(),this.loadCart(n),this.paused=r,!this.paused&&!Me&&this.resumeAudioLibraries()}getFrameRate(){return this.frameRate}updateFrameRate(t){if(this.frameRate=t,t>=1)this.targetDrawTime=1e3/t;else{let r=1/(2-t);this.targetDrawTime=1e3/r}this.drawTime=this.targetDrawTime}canvasMountOptions(){return{container:this.container,adoptFromDocument:!this.container}}syncContainerFromDom(){if(this.container){this.containerWidth=this.container.clientWidth||this.containerWidth,this.containerHeight=this.container.clientHeight||this.containerHeight;return}this.containerWidth=window.innerWidth,this.containerHeight=window.innerHeight}pinOutputSize(t){this.pinnedOutput=t,this.width=~~t.width,this.height=~~t.height,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.aspectRatio=this.width/this.height,this.mainCanvas&&this.mainCanvas.setSize(this.width,this.height)}shouldKeepPinnedOutput(){return this.pinnedOutput?(this.syncContainerFromDom(),this.viewportMatches(this.pinnedCssSize())?!0:!!(this.pinViewportAtImport&&this.viewportMatches(this.pinViewportAtImport))):!1}pinnedCssSize(){let t=this.pinnedOutput;return{w:t.cssWidth??t.width/fe,h:t.cssHeight??t.height/fe}}viewportMatches(t){return Math.abs(this.containerWidth-t.w)<8&&Math.abs(this.containerHeight-t.h)<8}fitPinnedCanvas(){let t=this.pinnedOutput,n=this.canvas;if(!t||!n)return;this.container&&!this.container.style.position&&(this.container.style.position="relative");let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=t.width/fe,a=t.height/fe;if(o<1||a<1||r<1||i<1)return;let d=Math.min(r/o,i/a),h=o*d,y=a*d;n.style.position="absolute",n.style.left="50%",n.style.top="50%",n.style.transform="translate(-50%, -50%)",n.style.margin="0",n.style.width=`${h}px`,n.style.height=`${y}px`,n.style.imageRendering=Math.abs(d-1)<.01?"auto":"pixelated"}clearPinnedOutput(){let t=this.canvas;this.pinnedOutput=null,this.pinViewportAtImport=null,t&&(t.style.position="",t.style.left="",t.style.top="",t.style.transform="",t.style.imageRendering="",t.style.width="",t.style.height="",t.style.margin="auto")}get canvas(){return this.animation?.getCanvas()??this.mainCanvas?.canvas}destroy(){this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.clearPinnedOutput(),this.unloadCart(),clearTimeout(this.reinitTimeout),this.mainCanvas&&!this.mainCanvas.adopted&&this.mainCanvas.canvas.remove()}drawIt(){}tuneFramerate(t){let n=this.lastCall||t;this.lastCall=t,this.drawTime=Math.max(0,this.drawTime+this.targetDrawTime-this.lastCall+n)}async processFrame(t,n={}){let r=n.ignorePause===!0,i=n.scheduleNext!==!1;if(!this.loopRunning&&!r)return;let o=!1,a,d="update";try{if(r||!this.paused||this.tempUnpause){if(!Me&&!r&&this.tuneFramerate(t),!this.animation)return;if(d="update",this.updateInProgress=!0,await this.animation.updateAnimationState(this.framesElapsed,this.rawParams,t),this.updateInProgress=!1,this.kind!=="calculation"&&(d="render",await this.animation.renderAnimation(this.framesElapsed,this.rawParams,t)),this.autoMode&&this.animation.cartState.saveToken&&!this.savedToken&&!new URLSearchParams(window.location.search).get("hash")){let S=localStorage.getItem("goodones"),g=JSON.stringify(S?[...JSON.parse(S),this.tokenData.hash]:[this.tokenData.hash]);localStorage.setItem("goodones",g),this.savedToken=!0,this.mainCanvas&&localStorage.setItem(this.tokenData.hash,this.mainCanvas.canvas.toDataURL("image/png")),window.location.reload(),this.loopRunning=!1;return}this.framesElapsed++,this.tempUnpause&&(this.tempUnpause=!1)}d="draw",this.drawIt()}catch(h){o=!0,a=h,this.handleFrameError(h,d)}finally{this.updateInProgress=!1}o?(this.consecutiveErrorCount++,this.consecutiveErrorCount>=yi&&(this.loopRunning=!1,this.onError?.(a,{phase:d,consecutive:this.consecutiveErrorCount,stopped:!0}))):this.consecutiveErrorCount=0,!(!this.loopRunning||!i)&&(this.drawLoopTimeout=setTimeout(()=>{this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)},this.drawTime))}async drawLoop(t){await this.processFrame(t,{scheduleNext:!0})}handleFrameError(t,n){let r=performance.now();r-this.lastErrorLogAt>=1e3&&(this.lastErrorLogAt=r,console.error(`Animation ${n} error:`,t)),this.consecutiveErrorCount===0&&this.onError?.(t,{phase:n,consecutive:1,stopped:!1})}pureAspectUpdate(t){if(t[0]===0&&t[1]===0){let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=r/i;this.aspectRatio=Math.min(bi,Math.max(vi,o))}else this.aspectRatio=t[0]/t[1]}};var Si="HostChannel has been destroyed",mt=class{constructor(){this.inbound=[];this.listeners=[];this.closed=!1}dispatch(t){this.requireOpen(),this.inbound.push(t),this.inbound.length>32&&this.inbound.splice(0,this.inbound.length-32)}consume(){if(this.requireOpen(),this.inbound.length===0)return[];let t=this.inbound;return this.inbound=[],t}emit(t){this.requireOpen();for(let n of this.listeners)n(t)}onEvent(t){return this.requireOpen(),this.listeners.push(t),()=>{this.listeners=this.listeners.filter(n=>n!==t)}}clearInbound(){this.requireOpen(),this.inbound=[]}clear(){this.inbound=[],this.listeners=[]}close(){this.closed=!0,this.clear()}requireOpen(){if(this.closed)throw new Error(Si)}};var pe=2,qt=1,Yt="0.0.5",qn="0",Yn="1970-01-01T00:00:00.000Z";function ue(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function gt(e){return JSON.parse(JSON.stringify(e))}function re(e,t,n,r){e.push(r?{code:t,detail:n,path:r}:{code:t,detail:n})}function Jn(e,t,n){try{let r=JSON.stringify(e);if(r===void 0){re(n,"invalid-field",`${t} is not JSON-serializable`,t);return}return JSON.parse(r)}catch{re(n,"invalid-field",`${t} is not JSON-serializable`,t);return}}function ae(e){return typeof e=="string"&&e.length>0}function ht(e){return typeof e=="number"&&Number.isFinite(e)}function Ei(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}function Jt(e){return!ue(e)||typeof e.schemaVersion=="number"?!1:typeof e.version=="number"&&typeof e.seed=="string"&&typeof e.framesElapsed=="number"&&"state"in e}function yt(e){if(ue(e)){if(typeof e.schemaVersion=="number")return Number.isInteger(e.schemaVersion)?e.schemaVersion:void 0;if(Jt(e))return qt}}function zt(e,t,n){try{return gt(ye(e))}catch(r){let i=r instanceof Error?r.message:"engineState is not a cart state bundle";re(n,"invalid-engine-state",i,t);return}}function Ai(e,t,n){if(!ue(e)){re(n,"invalid-field","cart must be an object",t);return}ae(e.id)||re(n,"invalid-field","cart.id must be a non-empty string",`${t}.id`),ae(e.version)||re(n,"invalid-field","cart.version must be a non-empty string",`${t}.version`);let r={id:typeof e.id=="string"?e.id:"",version:typeof e.version=="string"?e.version:""};return e.generative!==void 0&&(typeof e.generative!="boolean"?re(n,"invalid-field","cart.generative must be a boolean",`${t}.generative`):r.generative=e.generative),r.id&&r.version?r:void 0}function Ci(e,t,n){if(!ue(e)){re(n,"invalid-field","clock must be an object",t);return}if(!ht(e.framesElapsed)){re(n,"invalid-field","clock.framesElapsed must be a finite number",`${t}.framesElapsed`);return}let r={framesElapsed:e.framesElapsed};return e.elapsedSinceStart!==void 0&&(ht(e.elapsedSinceStart)?r.elapsedSinceStart=e.elapsedSinceStart:re(n,"invalid-field","clock.elapsedSinceStart must be a finite number",`${t}.elapsedSinceStart`)),e.now!==void 0&&(ht(e.now)?r.now=e.now:re(n,"invalid-field","clock.now must be a finite number",`${t}.now`)),e.frameRate!==void 0&&(ht(e.frameRate)?r.frameRate=e.frameRate:re(n,"invalid-field","clock.frameRate must be a finite number",`${t}.frameRate`)),r}function wi(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){re(n,"invalid-field","modules must be an array",t);return}let r=[];return e.forEach((i,o)=>{let a=`${t}[${o}]`;if(!ue(i)||!ae(i.id)||!ae(i.version)){re(n,"invalid-field","module refs need non-empty id and version",a);return}r.push({id:i.id,version:i.version})}),r}function ki(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){re(n,"invalid-field","assets must be an array",t);return}let r=[];return e.forEach((i,o)=>{let a=`${t}[${o}]`;if(!ue(i)||!ae(i.id)){re(n,"invalid-field","asset refs need a non-empty id",a);return}let d={id:i.id};i.version!==void 0&&(ae(i.version)?d.version=i.version:re(n,"invalid-field","asset.version must be a non-empty string",`${a}.version`)),i.ref!==void 0&&(ae(i.ref)?d.ref=i.ref:re(n,"invalid-field","asset.ref must be a non-empty string",`${a}.ref`)),r.push(d)}),r}function Ri(e,t,n){if(e===void 0)return;if(!ue(e)||!ae(e.seed)){re(n,"invalid-field","rng must include a seed",t);return}if(!ue(e.prngA)||!ue(e.prngB)){re(n,"invalid-field","rng must include prngA and prngB",t);return}if(typeof e.useA!="boolean"){re(n,"invalid-field","rng.useA must be a boolean",`${t}.useA`);return}return Jn(e,t,n)}function xi(e,t,n){if(e===void 0)return;if(!ue(e)){re(n,"invalid-field","provenance must be an object",t);return}let r={};return e.source!==void 0&&(ae(e.source)?r.source=e.source:re(n,"invalid-field","provenance.source must be a non-empty string",`${t}.source`)),e.integrity!==void 0&&(!ue(e.integrity)||!ae(e.integrity.alg)||!ae(e.integrity.hash)?re(n,"invalid-field","provenance.integrity needs alg and hash strings",`${t}.integrity`):r.integrity={alg:e.integrity.alg,hash:e.integrity.hash}),r}function Xn(e,t){e.schemaVersion!==void 0&&e.schemaVersion!==pe&&re(t,"invalid-schema",`defineSnapshot produces schema ${pe}`,"schemaVersion"),ae(e.seed)||re(t,"invalid-field","seed must be a non-empty string","seed");let n=e.runtimeVersion===void 0?Yt:e.runtimeVersion;ae(n)||re(t,"invalid-field","runtimeVersion must be a non-empty string","runtimeVersion");let r=e.createdAt===void 0?new Date().toISOString():e.createdAt;Ei(r)||re(t,"invalid-field","createdAt must be an ISO-8601 date","createdAt");let i=Ai(e.cart,"cart",t),o=Ci(e.clock,"clock",t),a=zt(e.engineState,"engineState",t),d=wi(e.modules,"modules",t),h=ki(e.assets,"assets",t),y=Ri(e.rng,"rng",t),S=xi(e.provenance,"provenance",t),g;if(e.hostState!==void 0&&(g=Jn(e.hostState,"hostState",t)),e.hostStateRef!==void 0&&!ae(e.hostStateRef)&&re(t,"invalid-field","hostStateRef must be a non-empty string","hostStateRef"),t.length>0||!i||!o||!a||!ae(e.seed))return;let k={schemaVersion:pe,runtimeVersion:n,cart:i,seed:e.seed,clock:o,engineState:a,createdAt:r};return d&&d.length>0&&(k.modules=d),y&&(k.rng=y),g!==void 0&&(k.hostState=g),ae(e.hostStateRef)&&(k.hostStateRef=e.hostStateRef),h&&h.length>0&&(k.assets=h),S&&(S.source||S.integrity)&&(k.provenance=S),k}function Ii(e){if(!ue(e))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot input is not an object"}]};let t=[],n=Xn(e,t);return!n||t.length>0?{ok:!1,errors:t}:{ok:!0,snapshot:n}}function bt(e,t){return ae(e.cartId)?Ii({cart:{id:e.cartId,version:t?.cartVersion??qn,generative:e.generative},modules:t?.modules,seed:e.seed,rng:t?.rng,clock:t?.clock??{framesElapsed:e.framesElapsed,elapsedSinceStart:e.elapsedSinceStart},engineState:e,hostState:t?.hostState,hostStateRef:t?.hostStateRef,assets:t?.assets,createdAt:t?.createdAt,provenance:t?.provenance,runtimeVersion:t?.runtimeVersion}):{ok:!1,errors:[{code:"invalid-field",detail:"cart.id is required",path:"cart.id"}]}}function zn(e){let t=gt(e),n={schemaVersion:qt,engineState:t,seed:t.seed,clock:{framesElapsed:t.framesElapsed,elapsedSinceStart:t.elapsedSinceStart}};return t.cartId&&(n.cart={id:t.cartId,version:qn,generative:t.generative}),n}function Xt(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return{ok:!1,errors:[{code:"invalid-json",detail:"Snapshot JSON could not be parsed"}]}}if(!ue(t))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(Jt(t))try{return{ok:!0,snapshot:zn(ye(t))}}catch(r){return{ok:!1,errors:[{code:"invalid-engine-state",detail:r instanceof Error?r.message:"Cart state bundle is invalid"}]}}let n=yt(t);if(n===void 0)return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is missing schemaVersion and is not a cart state bundle",path:"schemaVersion"}]};if(n===qt){let r=[],i=zt(t.engineState,"engineState",r);return!i||r.length>0?{ok:!1,errors:r}:{ok:!0,snapshot:zn(i)}}if(n!==pe){if(n>pe)return{ok:!1,errors:[{code:"unsupported-schema",detail:`Snapshot schema ${n} is newer than ${pe}`,path:"schemaVersion"}]};let r=[],i=zt(t.engineState,"engineState",r);return i?{ok:!0,snapshot:{schemaVersion:n,engineState:i,seed:typeof t.seed=="string"?t.seed:i.seed,clock:{framesElapsed:i.framesElapsed,elapsedSinceStart:i.elapsedSinceStart}}}:{ok:!1,errors:r.length?r:[{code:"invalid-snapshot",detail:`Snapshot schema ${n} is missing engineState`,path:"engineState"}]}}return ze(t)}function ze(e){if(!ue(e))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(e.schemaVersion!==pe)return{ok:!1,errors:[{code:"invalid-schema",detail:`Expected snapshot schema ${pe}`,path:"schemaVersion"}]};let t=[],n=Xn(e,t);return!n||t.length>0?{ok:!1,errors:t}:{ok:!0,snapshot:n}}function He(e){return e.map(t=>t.detail).join("; ")}function Qn(e){if(Jt(e))return ye(e);if(ue(e)&&e.engineState!==void 0)return ye(e.engineState);throw new Error("Legacy snapshot is missing engine state")}function Ti(){return[{from:1,to:2,migrate:Li}]}function Pi(e){let t=[...e?.migrations??Ti()],n=new Map;for(let r of t){if(!Number.isInteger(r.from)||!Number.isInteger(r.to)||r.to!==r.from+1)throw new Error(`Snapshot migration must step from n to n+1 (got ${String(r.from)} \u2192 ${String(r.to)})`);if(typeof r.migrate!="function")throw new Error(`Snapshot migration ${r.from} \u2192 ${r.to} is missing migrate()`);if(n.has(r.from))throw new Error(`Duplicate snapshot migration from schema ${r.from}`);n.set(r.from,r)}return{migrations:t,get(r){return n.get(r)}}}var Di=Pi();function Mi(){return Di}function Li(e){let t=Qn(e),n=bt(t,{createdAt:Yn,runtimeVersion:Yt});if(n.ok===!1)throw new Error(He(n.errors));return n.snapshot}function Zn(e){try{return gt(e)}catch{return}}function er(e,t=Mi()){let n=Zn(e);if(n===void 0)return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not JSON-serializable"}]};let r=n,i=yt(r);if(i===void 0){let o=Xt(r);if(o.ok===!1)return o;r=o.snapshot,i=o.snapshot.schemaVersion}if(i>pe)return{ok:!1,errors:[{code:"unsupported-schema",detail:`Snapshot schema ${i} is newer than ${pe}`,path:"schemaVersion"}]};if(i===pe)return ze(r);for(;i<pe;){let o=t.get(i);if(!o)return{ok:!1,errors:[{code:"missing-migration",detail:`No snapshot migration from schema ${i} to ${i+1}`,path:"schemaVersion"}]};let a;try{a=o.migrate(Zn(r))}catch(h){let y=h instanceof Error?h.message:"Migration threw";return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} failed: ${y}`,path:"schemaVersion"}]}}let d=yt(a);if(d!==o.to)return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} produced schema ${String(d)}`,path:"schemaVersion"}]};if(o.to===pe){let h=ze(a);if(h.ok===!1)return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} did not produce a valid snapshot`,path:"schemaVersion"},...h.errors]};r=h.snapshot}else r=a;i=o.to}return ze(r)}function tr(e,t){let n=e;if(typeof e=="string")try{n=JSON.parse(e)}catch{return{ok:!1,errors:[{code:"invalid-json",detail:"Snapshot JSON could not be parsed"}]}}if(!n||typeof n!="object")return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(typeof n.schemaVersion=="number"){let i=er(n,t);if(i.ok===!1)return i;try{return{ok:!0,bundle:ye(i.snapshot.engineState),snapshot:i.snapshot}}catch(o){return{ok:!1,errors:[{code:"invalid-engine-state",detail:o instanceof Error?o.message:"engineState is not a cart state bundle",path:"engineState"}]}}}try{return{ok:!0,bundle:ye(n)}}catch(i){return{ok:!1,errors:[{code:"invalid-engine-state",detail:i instanceof Error?i.message:"Cart state bundle is invalid"}]}}}function nr(e,t){let n=Xt(e);return n.ok===!1?n:er(n.snapshot,t)}var Vi=["image","audio","font","spritesheet"],Fi=["timeout","cors","not-found","invalid","aborted","resolver"],qe="cyberart:fallback/silent",rr="Asset preloader has been destroyed",Hi=4,Oi=new Set(Vi),_i=new Set(Fi),Ni={timeout:"asset load timed out",cors:"CORS blocked this asset","not-found":"asset was not found",invalid:"asset declaration or resource is invalid",aborted:"asset load was aborted",resolver:"asset resolver failed"};function Ki(e){return typeof e=="string"&&Oi.has(e)}function Ui(e){return typeof e=="string"&&_i.has(e)}function Qt(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.id=="string"&&typeof t.ref=="string"&&Ui(t.code)&&typeof t.message=="string"}function oe(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message&&e.message.length>0?e.message:Ni[e.code]}}function Oe(e,t){return{type:e==="ready"?Ee:Ae,kind:"state",payload:t}}function Bi(e){return e instanceof Error&&e.name==="AbortError"||typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"}function Zt(e){return e?{...e}:void 0}function be(e){let t={id:e.id,ref:e.ref,type:e.type,url:e.url};return e.integrity!==void 0&&(t.integrity=e.integrity),e.provenance&&(t.provenance=Zt(e.provenance)),e.cors!==void 0&&(t.cors=e.cors),e.usedFallback&&(t.usedFallback=!0),e.managed&&(t.managed=!0),t}function Ye(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message}}function $i(e){if(e.state==="ready"){let t={state:"ready",resource:be(e.resource)};return e.failure&&(t.failure=Ye(e.failure)),t}return e.state==="failed"?{state:"failed",failure:Ye(e.failure)}:{state:e.state}}function Gi(e){if(!e||typeof e!="object")return oe({id:"",ref:"",code:"invalid",message:"declaration is required"});if(typeof e.id!="string"||e.id.length===0)return oe({id:typeof e.id=="string"?e.id:"",ref:typeof e.ref=="string"?e.ref:"",code:"invalid",message:"id is required"});if(typeof e.ref!="string"||e.ref.length===0)return oe({id:e.id,ref:"",code:"invalid",message:"ref is required"});if(!Ki(e.type))return oe({id:e.id,ref:e.ref,code:"invalid",message:`unsupported type ${String(e.type)}`});if(e.integrity!==void 0&&typeof e.integrity!="string")return oe({id:e.id,ref:e.ref,code:"invalid",message:"integrity must be a string"});if(e.timeoutMs!==void 0&&(typeof e.timeoutMs!="number"||!Number.isFinite(e.timeoutMs)||e.timeoutMs<0))return oe({id:e.id,ref:e.ref,code:"invalid",message:"timeoutMs must be a non-negative finite number"})}function ir(e){return{id:e.id,ref:qe,type:e.type,url:qe,usedFallback:!0,cors:"omit"}}function or(e,t){return Qt(t)?{id:e.id,ref:e.ref,code:t.code,message:t.message}:Bi(t)?oe({id:e.id,ref:e.ref,code:"aborted"}):oe({id:e.id,ref:e.ref,code:"resolver",message:t instanceof Error?t.message:String(t)})}function sr(e,t){if(!t||typeof t.url!="string"||t.url.length===0)throw oe({id:e.id,ref:e.ref,code:"invalid",message:"resolver returned no url"});if(t.integrity&&e.integrity&&t.integrity!==e.integrity)throw oe({id:e.id,ref:e.ref,code:"invalid",message:"integrity mismatch"});let n=be(t);return n.id=e.id,n.ref=t.ref||e.ref,n.type=e.type,!n.integrity&&e.integrity&&(n.integrity=e.integrity),!n.provenance&&e.provenance&&(n.provenance=Zt(e.provenance)),n}function ar(e){if(typeof e?.resolver?.resolve!="function")throw new Error("createAssetPreloader: resolver is required");let t=e.emitEvents!==!1,n=e.wallClockTimeout!==!1,r=new Map,i=[],o=new Map,a=new Map,d=new Map,h=new Map,y=new Map,S=new Set,g=!1;function k(f){return f.code==="aborted"||f.code==="timeout"}function F(f,O,M){let Z=or(f,M);return Z.code==="timeout"?Z:O.aborted?oe({id:f.id,ref:f.ref,code:"aborted"}):Z}function x(f,O){let M=y.get(f);M||(M=new Set,y.set(f,M)),M.add(O)}function E(f){if(f?.state==="ready")return`${f.resource.type}\0${f.resource.ref}`}function V(f,O){for(let[M,Z]of y)if(M!==O&&Z.has(f))return!0;for(let[M,Z]of r)if(M!==O&&E(Z)===f)return!0;return!1}function U(f,O){let M=new Set(y.get(f)),Z=E(O);Z&&M.add(Z),y.delete(f);for(let l of M)V(l,f)||d.delete(l)}function W(){let f=0,O=0,M=0,Z=0,l={};for(let[v,w]of r)l[v]=$i(w),w.state==="pending"||w.state==="loading"?f+=1:w.state==="failed"?M+=1:(O+=1,(w.resource.usedFallback||w.failure)&&(Z+=1));return{total:r.size,pending:f,ready:O,failed:M,fallbacks:Z,items:l,failures:i.map(Ye)}}function p(){if(S.size===0)return;let f=W();for(let O of S)O(f)}function b(f){i.push(Ye(f))}function c(f){g||!t||!e.dispatch||e.dispatch(f)}function u(f){if(f?.managed&&f.url.startsWith("blob:")&&!(typeof URL>"u"||typeof URL.revokeObjectURL!="function"))try{URL.revokeObjectURL(f.url)}catch{}}function R(f,O){if(g)return;let M=r.get(f);M?.state==="ready"&&u(M.resource),r.set(f,O),p()}function B(f){if(f.fallback!==void 0)return f.fallback==="silent"?{id:`${f.id}::fallback`,ref:qe,type:f.type}:typeof f.fallback=="string"?{id:`${f.id}::fallback`,ref:f.fallback,type:f.type}:{...f.fallback,id:typeof f.fallback.id=="string"&&f.fallback.id.length>0?f.fallback.id:`${f.id}::fallback`}}function te(f,O,M){let Z=`${f.type}\0${f.ref}`,l=d.get(Z);if(l)return O.aborted?Promise.reject(oe({id:f.id,ref:f.ref,code:"aborted"})):(x(M,Z),Promise.resolve(be(l.resource)));if(O.aborted)return Promise.reject(oe({id:f.id,ref:f.ref,code:"aborted"}));let v=h.get(Z);if(!v){let P=new AbortController,T={id:f.id,ref:f.ref,type:f.type};f.integrity!==void 0&&(T.integrity=f.integrity),f.provenance&&(T.provenance=Zt(f.provenance)),v={promise:Promise.resolve().then(()=>e.resolver.resolve(T,P.signal)).then(K=>{let $=sr(f,K);if(P.signal.aborted)throw oe({id:f.id,ref:f.ref,code:"aborted"});return d.set(Z,{resource:be($)}),$}).catch(K=>{throw or(f,K)}).finally(()=>{h.delete(Z)}),controller:P,waiters:0},h.set(Z,v)}let w=v;return w.waiters+=1,new Promise((P,T)=>{let L=!1,K=(s,A)=>{L||(L=!0,O.removeEventListener("abort",$),w.waiters-=1,A&&w.waiters<=0&&w.controller.abort(),s())},$=()=>{K(()=>T(oe({id:f.id,ref:f.ref,code:"aborted"})),!0)};if(O.aborted){$();return}O.addEventListener("abort",$,{once:!0}),w.promise.then(s=>{if(!L){if(O.aborted){$();return}x(M,Z),K(()=>P(be(s)),!1)}},s=>{if(!L){if(O.aborted){$();return}K(()=>T(s),!1)}})})}function _(f,O,M){if(O.aborted)return Promise.reject(oe({id:f.id,ref:f.ref,code:"aborted"}));if(f.ref===qe)return Promise.resolve(ir(f));let Z=new AbortController,l=()=>Z.abort();O.addEventListener("abort",l,{once:!0});let v=f.timeoutMs??e.timeoutMs,w,P=!1;return n&&v!==void 0&&v>0&&Number.isFinite(v)&&(w=setTimeout(()=>{P=!0,Z.abort()},v)),te(f,Z.signal,M).then(T=>{let L=sr(f,T);return L.id=f.id,L}).catch(T=>{throw P?oe({id:f.id,ref:f.ref,code:"timeout"}):T}).finally(()=>{w!==void 0&&clearTimeout(w),O.removeEventListener("abort",l)})}async function Y(f,O,M,Z){try{return{resource:await _(f,O,Z)}}catch(l){let v=F(f,O,l);if(k(v)||O.aborted||M>=Hi)throw v;let w=B(f);if(!w)throw v;if(O.aborted)throw oe({id:f.id,ref:f.ref,code:"aborted"});if(f.fallback==="silent"||w.ref===qe)return{resource:ir(f),failure:v};try{let P=await Y(w,O,M+1,Z);return{resource:{...be(P.resource),id:f.id,usedFallback:!0},failure:v}}catch(P){let T=Qt(P)&&!k(P)&&!O.aborted?P:F(f,O,P);throw!k(T)&&!O.aborted&&b(v),T}}}async function q(f,O){if(g)throw new Error(rr);let M=r.get(f.id);if(M?.state==="ready"||M?.state==="failed")return;let Z=o.get(f.id);if(Z){await Z;return}let l=(async()=>{let v=Gi(f);if(v){R(f.id,{state:"failed",failure:v}),b(v),c(Oe("failed",{id:f.id,ref:f.ref,failure:v}));return}R(f.id,{state:"loading"});let w=a.get(f.id)??new AbortController;a.has(f.id)||a.set(f.id,w);try{let P=await Y(f,w.signal,O,f.id);if(g)return;if(w.signal.aborted){let T=oe({id:f.id,ref:f.ref,code:"aborted"});R(f.id,{state:"failed",failure:T}),b(T),c(Oe("failed",{id:f.id,ref:f.ref,failure:T}));return}if(P.resource.id=f.id,P.failure){R(f.id,{state:"ready",resource:P.resource,failure:P.failure}),b(P.failure),c(Oe("failed",{id:f.id,ref:f.ref,failure:P.failure,resource:be(P.resource)})),c(Oe("ready",{id:f.id,ref:P.resource.ref,resource:be(P.resource),failure:P.failure}));return}R(f.id,{state:"ready",resource:P.resource}),c(Oe("ready",{id:f.id,ref:f.ref,resource:be(P.resource)}))}catch(P){if(g)return;let T=Qt(P)&&!k(P)&&!w.signal.aborted?{...Ye(P),id:f.id}:F(f,w.signal,P);R(f.id,{state:"failed",failure:T}),b(T),c(Oe("failed",{id:f.id,ref:f.ref,failure:T}))}finally{a.get(f.id)===w&&a.delete(f.id)}})();o.set(f.id,l);try{await l}finally{o.delete(f.id)}}return{async preload(f){if(g)throw new Error(rr);let O=Array.isArray(f)?f:[];for(let M of O)M&&typeof M.id=="string"&&M.id.length>0&&(r.has(M.id)||r.set(M.id,{state:"pending"}),a.has(M.id)||a.set(M.id,new AbortController));return p(),await Promise.all(O.map(M=>q(M,0))),W()},get(f){let O=r.get(f);if(O?.state==="ready")return be(O.resource)},getProgress(){return W()},onProgress(f){return S.add(f),()=>{S.delete(f)}},abort(f){if(!g){if(f!==void 0){a.get(f)?.abort();return}for(let O of a.values())O.abort()}},forget(f){if(g)return;if(f===void 0){for(let M of r.values())M.state==="ready"&&u(M.resource);r.clear(),i.length=0,d.clear(),y.clear(),p();return}let O=r.get(f);O?.state==="ready"&&u(O.resource),U(f,O),r.delete(f);for(let M=i.length-1;M>=0;M--)i[M].id===f&&i.splice(M,1);p()},dispose(){if(!g){g=!0;for(let f of a.values())f.abort();a.clear();for(let f of r.values())f.state==="ready"&&u(f.resource);r.clear(),i.length=0,o.clear();for(let f of h.values())f.controller.abort();d.clear(),h.clear(),y.clear(),S.clear()}}}}var dr=.25;function _e(e){return e.error===void 0?{state:e.state}:{state:e.state,error:e.error}}function en(e){return!Number.isFinite(e)||e<0?0:e>1?1:e}function ji(e){return e instanceof Error&&e.message?e.message:String(e)}async function Wi(){let{adaptersFor:e}=await Promise.resolve().then(()=>(Ut(),Nn)),t=e(["tone"]),n=typeof navigator<"u"&&/Headless/i.test(navigator.userAgent);for(let r of t)n?await r.load():await r.unlock()}function zi(e){if(!e||typeof e!="object")return;let t=e.id;return typeof t=="string"&&t.length>0?t:void 0}function ur(e={}){let t=e.toneStart??Wi,n=!!e.reducedSensory,r=new Set,i=new Map,o=new Map,a=new Map,d=[],h={state:"locked"},y,S=!1,g=!1;function k(p){for(let b of d.slice())b(p)}function F(p,b){let c=i.get(p);if(c)return b&&!c.participantId&&(c.participantId=b),c;let u={id:p,participantId:b,gain:1,muted:!1,duckGain:1,priority:0,manualDuck:!1};return i.set(p,u),u}function x(p){return S||p.muted?0:en(p.gain*p.duckGain)}function E(p){return{id:p.id,participantId:p.participantId,gain:p.gain,muted:p.muted,duckGain:p.duckGain,priority:p.priority,effectiveGain:x(p)}}function V(){let p=-1/0;for(let b of a.values())b.priority>p&&(p=b.priority);for(let b of i.values())if(!b.manualDuck){if(p===-1/0){b.duckGain=1;continue}b.duckGain=b.priority<p?dr:1}}async function U(){if(g||h.state==="unlocked")return _e(h);if(y)return await y,_e(h);h={state:"unlocking"},y=(async()=>{try{await t(),h={state:"unlocked"}}catch(p){h={state:"failed",error:ji(p)}}})();try{await y}finally{y=void 0}return _e(h)}return{unlock:U,status(){return _e(h)},authorize(p){g||typeof p!="string"||p.length===0||r.add(p)},revoke(p){g||r.delete(p)},isAuthorized(p){return p===void 0||p.length===0?r.size===0:r.size===0?!0:r.has(p)},setChannelGain(p,b,c){g||typeof p!="string"||p.length===0||(F(p,c).gain=en(b))},setPriority(p,b,c){g||typeof p!="string"||p.length===0||(F(p,c).priority=Number.isFinite(b)?b:0,V())},mute(){g||(S=!0,k({type:"mute"}))},unmute(){g||(S=!1,k({type:"mute"}))},muteChannel(p,b){g||typeof p!="string"||p.length===0||(F(p,b).muted=!0,k({type:"mute"}))},unmuteChannel(p){if(g)return;let b=i.get(p);b&&(b.muted=!1,k({type:"mute"}))},duck(p,b=dr){if(g||typeof p!="string"||p.length===0)return;let c=F(p);c.manualDuck=!0,c.duckGain=en(b)},unduck(p){if(g)return;let b=i.get(p);b&&(b.manualDuck=!1,V())},effectiveGain(p){let b=i.get(p);return b?x(b):S?0:1},handleHostEvent(p){if(g||!p||typeof p!="object")return;let b=zi(p.payload);if(b){if(p.type===Ee){o.set(b,"ready"),k({type:"asset",id:b,status:"ready"});return}p.type===Ae&&(o.set(b,"failed"),k({type:"asset",id:b,status:"failed"}))}},assetStatus(p){return o.get(p)},noteCueStarted(p){if(g)return;a.set(p.idempotencyKey,{idempotencyKey:p.idempotencyKey,channelId:p.channelId,participantId:p.participantId,priority:p.priority});let b=F(p.channelId,p.participantId);p.priority>b.priority&&(b.priority=p.priority),V()},noteCueEnded(p){a.delete(p)&&V()},teardown(p){if(!g&&!(typeof p!="string"||p.length===0)){r.delete(p);for(let[b,c]of[...a.entries()])c.participantId===p&&a.delete(b);for(let[b,c]of[...i.entries()])c.participantId===p&&i.delete(b);V(),k({type:"teardown",participantId:p})}},onNotice(p){return d.push(p),()=>{let b=d.indexOf(p);b>=0&&d.splice(b,1)}},inspect(){let p=[...o.entries()].sort(([c],[u])=>c<u?-1:c>u?1:0),b={};for(let[c,u]of p)b[c]=u;return{status:_e(h),reducedSensory:n,muted:S,authorized:[...r].sort(),channels:[...i.values()].sort((c,u)=>c.id<u.id?-1:c.id>u.id?1:0).map(E),assets:b}},destroy(){g||(g=!0,a.clear(),i.clear(),r.clear(),k({type:"destroy"}),d.length=0)},get reducedSensory(){return n},get muted(){return S}}}function cr(e,t){let n=e.dispatch.bind(e);e.dispatch=r=>{t.handleHostEvent(r),n(r)}}function vt(e){En();let{container:t,seed:n,captureKeyboard:r=!1,audio:i,deterministic:o,assets:a,audioBroker:d,audioParticipantId:h,kind:y="render"}=e,S=n===void 0?void 0:Vn(n,o?"deterministic":"live"),g=new mt;if(d&&(cr(g,d),h&&d.authorize(h)),a&&typeof a.resolver?.resolve!="function")throw new Error("createRuntime: assets.resolver is required");let k=a?ar({resolver:a.resolver,timeoutMs:a.timeoutMs,emitEvents:a.emitEvents??!o,wallClockTimeout:!o,dispatch:R=>g.dispatch(R)}):void 0,F=!1,x=null,E,V=!1,U=t.clientWidth||window.innerWidth,W=t.clientHeight||window.innerHeight,p=new ft(30,!1,U,W,!1,void 0,{container:t,seed:S,captureKeyboard:r,hostChannel:g,audio:i,deterministic:o,kind:y}),b=()=>{let R=t.clientWidth||window.innerWidth,B=t.clientHeight||window.innerHeight;return R===p.containerWidth&&B===p.containerHeight?!1:(p.containerWidth=R,p.containerHeight=B,!0)},c=null;return!p.isDeterministic&&typeof ResizeObserver<"u"&&(c=new ResizeObserver(()=>{if(F||!x)return;b()&&V&&p.reinit()}),c.observe(t)),p.onError=(R,B)=>{E?.(R,B)},{get tokenData(){return p.tokenData},get hostChannel(){return g},get assets(){return k},get audioBroker(){return d},get kind(){return y},get onError(){return E},set onError(R){E=R},mount(R,B={}){if(F)throw new Error("createRuntime: cannot mount on a destroyed runtime");x?.destroy(),V=!1,p.customState=B.initialState,p.setGameManager(B.gameManager);let te=B.onEvent?g.onEvent(B.onEvent):()=>{};if(d&&h&&d.authorize(h),!p.prepareCart(R))throw te(),new Error("createRuntime: failed to prepare cart");let _=!1,Y={async start(){if(!_){if(b()&&p.isPrepared&&(p.init(),p.unloadCart(),!p.prepareCart(R)))throw new Error("createRuntime: failed to prepare cart");p.needsAudio&&(d?await d.unlock():await p.unlockAudio(),_)||(V=!0,p.beginPlayback())}},pause(){_||(p.paused=!0)},resume(){_||(p.paused=!1)},dispatch(q){_||g.dispatch(q)},snapshot(){if(_)return{seed:"",pngDataUrl:""};let q=p.canvas;return{seed:p.tokenData.hash,metadata:R.metadata,pngDataUrl:q?q.toDataURL("image/png"):""}},destroy(){_||(_=!0,V=!1,te(),g.clearInbound(),p.unloadCart(),x===Y&&(x=null))},reload(){if(!_){if(!V){if(p.isPrepared&&(p.unloadCart(),!p.prepareCart(R)))throw new Error("createRuntime: failed to prepare cart");return}p.reloadCart()}},reinit(q){if(!_){if(!V){b();return}p.reinit(q)}},getCartState(){return p.animation?.cartState},exportState(){return _?Promise.reject(new Error("Cart handle has been destroyed")):p.exportState()},exportStateJSON(){return _?Promise.reject(new Error("Cart handle has been destroyed")):p.exportStateJSON()},async importState(q,f){if(_)throw new Error("Cart handle has been destroyed");let O=q,M=q;if(typeof q=="string")try{M=JSON.parse(q)}catch{await p.importState(q,f);return}if(M&&typeof M=="object"&&typeof M.schemaVersion=="number"){let Z=tr(M);if(Z.ok===!1)throw new de(He(Z.errors));await p.importState(Z.bundle,f);return}await p.importState(typeof O=="string"?O:M,f)},async exportSnapshot(q){if(_)throw new Error("Cart handle has been destroyed");let f=await p.exportState(),O=p.getClock(),M=bt(f,{...q,rng:p.getRandomState(),clock:{framesElapsed:f.framesElapsed,elapsedSinceStart:f.elapsedSinceStart,now:O.now,frameRate:O.frameRate}});if(M.ok===!1)throw new de(He(M.errors));return M.snapshot},async exportSnapshotJSON(q){return JSON.stringify(await Y.exportSnapshot(q))},async importSnapshot(q,f){if(_)throw new Error("Cart handle has been destroyed");let O=nr(q);if(O.ok===!1)throw new de(He(O.errors));await p.importState(O.snapshot.engineState,f)},peekExportedFramebuffer(){return _?null:p.peekExportedFramebuffer()},peekSeed(){if(!_)return p.peekSeed()},isGenerative(){return _?!1:p.isGenerative()},async step(q=1){if(_)throw new Error("Cart handle has been destroyed");await p.step(q)},async advance(q){if(_)throw new Error("Cart handle has been destroyed");await p.advance(q)},schedule(q){_||p.schedule(q)},getClock(){if(_)throw new Error("Cart handle has been destroyed");return p.getClock()},getRandomState(){if(_)throw new Error("Cart handle has been destroyed");return p.getRandomState()},getReplayMetadata(){return _?Promise.reject(new Error("Cart handle has been destroyed")):p.getReplayMetadata()},get canvas(){return p.canvas},get paused(){return p.paused},set paused(q){_||(p.paused=q)},get tokenData(){return p.tokenData},get isPrepared(){return p.isPrepared},get isLoopRunning(){return p.isLoopRunning},get needsAudio(){return p.needsAudio},get audioLibraries(){return p.audioLibraries}};return x=Y,Y},async unlockAudio(){if(d){p.needsAudio&&await d.unlock();return}await p.unlockAudio()},destroy(){F||(F=!0,x?.destroy(),x=null,d&&h&&d.teardown(h),c?.disconnect(),c=null,k?.dispose(),g.close(),p.destroy())}}}var lr="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",pr=320,fr=180,qi="Headless harness has been destroyed",mr=!1;function St(e={}){if(e.glyphAtlas&&Mt(e.glyphAtlas),typeof globalThis.ImageData>"u"){class n{constructor(i,o,a){this.colorSpace="srgb";typeof i=="number"?(this.width=i,this.height=o??0,this.data=new Uint8ClampedArray(this.width*this.height*4)):(this.data=i,this.width=o??0,this.height=a??i.length/4/this.width)}}globalThis.ImageData=n}Sn();let t=HTMLCanvasElement.prototype;t.getContext=function(r,i){return String(r??"2d").toLowerCase()!=="2d"?null:Lt(this,{alpha:i?.alpha!==!1,glyphAtlas:e.glyphAtlas})},t.toDataURL=function(r){if(r&&r!=="image/png")throw new ne(`toDataURL(${r})`);return hn(this)??lr},mr=!0}function Yi(e,t){let n=document.createElement("div");return Object.defineProperty(n,"clientWidth",{value:e,configurable:!0}),Object.defineProperty(n,"clientHeight",{value:t,configurable:!0}),document.body.appendChild(n),n}function Ji(e){let t=e.indexOf(","),n=t>=0?e.slice(t+1):e,r=globalThis.atob(n),i=new Uint8Array(r.length);for(let o=0;o<r.length;o++)i[o]=r.charCodeAt(o);return i}function Xi(){return typeof process<"u"&&!!process.versions?.node}async function Qi(e,t){if(!Xi())throw new Error("captureFrame(path) requires Node.js; omit the path to get the snapshot only");let n;try{({writeFile:n}=await import("node:fs/promises"))}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`captureFrame(path) could not load node:fs/promises (${i}). Omit the path, or run under Node.`)}try{await n(e,Ji(t))}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`captureFrame could not write ${e}: ${i}`)}}function Zi(e){mr||St();let t=e.width??pr,n=e.height??fr,r=Yi(t,n),i=[],o=[],a=!1,d=e.onEvent,h=e.onError,y=vt({container:r,seed:e.seed,deterministic:{origin:e.origin,actions:e.actions??[]}});y.onError=(x,E)=>{o.push({error:x,info:E}),h?.(x,E)},Object.defineProperty(y,"onError",{configurable:!0,enumerable:!0,get(){return h},set(x){h=x}});let S=x=>{i.push(x),d?.(x)},g=y.mount(e.cart,{initialState:e.initialState,gameManager:e.gameManager,onEvent:S}),k=()=>{if(a)throw new Error(qi)};return{runtime:y,container:r,get events(){return i.slice()},get errors(){return o.slice()},get cart(){return g},async step(x=1){k(),await g.step(x)},async advance(x){k(),await g.advance(x)},schedule(x){k(),g.schedule(x)},dispatch(x){k(),g.dispatch(x)},start(){return k(),g.start()},pause(){k(),g.pause()},resume(){k(),g.resume()},get paused(){return g.paused},key(x){k(),g.schedule({type:"key",atFrame:g.getClock().framesElapsed,key:x})},click(x,E){k(),g.schedule({type:"pointer",atFrame:g.getClock().framesElapsed,pointer:{kind:"down",x,y:E}})},async inspect(){k();let x=await g.getReplayMetadata();return{state:x.state,events:i.slice(),errors:o.slice(),replay:x,clock:g.getClock()}},async captureFrame(x){k();let E=g.snapshot();return x&&await Qi(x,E.pngDataUrl),E},remount(x={}){return k(),i.length=0,o.length=0,"onEvent"in x&&(d=x.onEvent),g=y.mount(e.cart,{initialState:x.initialState??e.initialState,gameManager:x.gameManager??e.gameManager,onEvent:S}),g},destroy(){if(!a){a=!0;try{g.destroy()}finally{try{y.destroy()}finally{r.remove()}}}}}}var hr="CYBERART_UPDATE_GOLDEN";function gr(e=typeof process<"u"?process.env:void 0){let t=e?.[hr];return t==="1"||t==="true"}function tn(e){return Vt(rt(e))}function yr(e,t,n={}){if(e.width!==t.width||e.height!==t.height){let S=to(e,t);return{match:!1,differingPixels:e.width*e.height,width:e.width,height:e.height,artifacts:S,updatedGolden:!1}}let r=n.tolerance??0,i=n.perceptualThreshold,o=n.maxDifferingPixels??0,a=new Uint8ClampedArray(e.width*e.height*4),d=0;for(let S=0;S<e.data.length;S+=4){let g=Math.abs(e.data[S]-t.data[S]),k=Math.abs(e.data[S+1]-t.data[S+1]),F=Math.abs(e.data[S+2]-t.data[S+2]),x=Math.abs(e.data[S+3]-t.data[S+3]),E=.299*g+.587*k+.114*F,V=n.alphaTolerance??r;(i!==void 0?E<=i&&x<=V:g<=r&&k<=r&&F<=r&&x<=V)?(a[S]=0,a[S+1]=0,a[S+2]=0,a[S+3]=255):(d+=1,a[S]=255,a[S+1]=0,a[S+2]=255,a[S+3]=255)}let h=nn(t,e,Se(a,e.width,e.height),d);return n.updateGolden===!0||gr()?{match:!0,differingPixels:0,width:e.width,height:e.height,artifacts:nn(e,e,Se(a,e.width,e.height),0),updatedGolden:!0}:{match:d<=o,differingPixels:d,width:e.width,height:e.height,artifacts:h,updatedGolden:!1}}function br(e,t,n={}){let r=yr(e,t,n);if(!r.match){let i=new Error(`Visual assertion failed: ${r.differingPixels} differing pixels (${r.width}\xD7${r.height}). Review expected/actual/diff PNG buffers on the result.`);throw i.visual=r,i}return r}function eo(e,t,n={}){return br(tn(e),tn(t),n)}function nn(e,t,n,r){let i=Pe(e.width,e.height,e.data),o=Pe(t.width,t.height,t.data),a=Pe(n.width,n.height,n.data);return{expectedPng:i,actualPng:o,diffPng:a,expectedDataUrl:De(e.width,e.height,e.data),actualDataUrl:De(t.width,t.height,t.data),diffDataUrl:De(n.width,n.height,n.data),differingPixels:r}}function to(e,t){let n=Math.max(e.width,t.width),r=Math.max(e.height,t.height),i=new Uint8ClampedArray(n*r*4);for(let o=0;o<i.length;o+=4)i[o]=255,i[o+1]=0,i[o+2]=255,i[o+3]=255;return nn(t,e,Se(i,n,r),n*r)}async function no(e,t,n={}){let{mkdir:r,writeFile:i}=await import("node:fs/promises"),{join:o}=await import("path");await r(e,{recursive:!0});let a=o(e,n.expected??"expected.png"),d=o(e,n.actual??"actual.png"),h=o(e,n.diff??"diff.png");return await i(a,t.expectedPng),await i(d,t.actualPng),await i(h,t.diffPng),{expectedPath:a,actualPath:d,diffPath:h}}var vr="cyberart.state.save",Sr="cyberart.state.load";var Et=1,Je="cyberart.diagnostic.rejected",rn=8,ro=new Set(["intent","state","diagnostic"]),io=new Set([vr,Sr]);function Er(e){return typeof e=="string"&&ro.has(e)}function oo(e){if(e.kind!==void 0)return Er(e.kind)?e.kind:void 0;if(!(typeof e.type!="string"||e.type.length===0)){if(io.has(e.type))return"intent";for(let t of e.type.split("."))if(Er(t))return t}}function so(e,t){let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function Ne(e,t){for(let n of e)if(so(n,t))return!0;return!1}function ao(e){if(e===void 0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(JSON.stringify(e))}}catch{return{ok:!1}}}function on(e,t){if(!e||typeof e.type!="string"||e.type.length===0)return{ok:!1,reason:"malformed",detail:"type is required"};if(e.schemaVersion!==void 0&&e.schemaVersion!==Et)return{ok:!1,reason:"malformed",detail:`unsupported schemaVersion ${String(e.schemaVersion)}`};let n=oo(e);if(!n)return{ok:!1,reason:"malformed",detail:`cannot infer kind from type "${e.type}"`};let r=ao(e.payload);if(!r.ok)return{ok:!1,reason:"malformed",detail:"payload is not JSON-serializable"};let i=t.createId(),o=typeof e.correlationId=="string"&&e.correlationId.length>0?e.correlationId:i,a=typeof e.causationId=="string"&&e.causationId.length>0?e.causationId:t.causationId,d=typeof e.target=="string"&&e.target.length>0?e.target:void 0,h=t.maxHops??rn,y=t.parentHops===void 0?h:Math.max(0,t.parentHops-1),S=typeof e.idempotencyKey=="string"&&e.idempotencyKey.length>0?e.idempotencyKey:void 0,g={schemaVersion:Et,type:e.type,kind:n,source:t.source,id:i,correlationId:o,seq:t.seq,hops:y};return d&&(g.target=d),a&&(g.causationId=a),S&&(g.idempotencyKey=S),r.value!==void 0&&(g.payload=r.value),{ok:!0,envelope:g}}var uo=new Set(["rate-limited","storm-detected","hop-limit","loop-detected","not-subscribed"]),co=8,lo=8,po=16,fo=256,mo=256,ho=["*.intent.*"];function Ar(e={}){let t=e.hostSource??"host",n="router",r=e.maxPerTurn??co,i=e.maxCausationDepth??lo,o=e.maxHops??rn,a=e.maxCorrelationPerTurn??po,d=e.maxIndex??fo,h=e.maxDecisions??mo,y=e.maxPerWindow,S=e.windowMs??1e3,g=e.now??Date.now,k=0,F=e.createId??(()=>`evt-${++k}`),x=new Map,E=[],V=[],U=new Map,W=new Map,p=new Map,b=[],c=0,u=0,R=0;function B(m){try{return JSON.parse(JSON.stringify(m))}catch{return m}}function te(m){for(b.push(m);b.length>h;)b.shift();for(let I of V)try{I(B(m))}catch{}}function _(m,I){let H={outcome:I.outcome,source:I.source,type:m.type,kind:m.kind,envelopeId:m.id,deliveredTo:I.deliveredTo,hops:m.hops,seq:m.seq,correlationId:m.correlationId,schemaVersion:m.schemaVersion,turn:R,time:g()};return I.reason&&(H.reason=I.reason),I.detail&&(H.detail=I.detail),I.priorEnvelopeId&&(H.priorEnvelopeId=I.priorEnvelopeId),m.target&&(H.target=m.target),m.causationId&&(H.causationId=m.causationId),m.idempotencyKey&&(H.idempotencyKey=m.idempotencyKey),m.payload!==void 0&&(H.payload=B(m.payload)),H}let Y=[],q=!1;function f(m,I,H){for(m.set(I,H);m.size>d;){let G=m.keys().next().value;if(G===void 0)break;m.delete(G)}}function O(m){f(U,m.id,{type:m.type,source:m.source,causationId:m.causationId,hops:m.hops,correlationId:m.correlationId,idempotencyKey:m.idempotencyKey})}function M(m,I){I&&(m.correlationId||(m.correlationId=I.correlationId),m.causationId||(m.causationId=I.id),!m.idempotencyKey&&I.idempotencyKey&&(m.idempotencyKey=`${I.idempotencyKey}::${m.type}`))}function Z(m,I){if(m){let H=U.get(m);return H?H.hops:o}return I}function l(m,I){return`${m}\0${I}`}function v(m,I){m.idempotencyKey&&f(p,l(m.source,m.idempotencyKey),I)}function w(m,I){if(I)return p.get(l(m,I))}function P(m){return w(m.source,m.idempotencyKey)}function T(m){return m.seq+=1,m.seq}function L(m,I){if(!(typeof I.causationId=="string"&&I.causationId.length>0))return m.lastDelivered}function K(m){let I=new Set,H=new Set([`${m.type}\0${m.source}`]),G=m.causationId,j=0;for(;G;){if(j+=1,j>i||I.has(G))return!0;I.add(G);let Q=U.get(G);if(!Q)break;let le=`${Q.type}\0${Q.source}`;if(H.has(le))return!0;H.add(le),G=Q.causationId}return!1}function $(m){let I=(W.get(m)??0)+1;return W.set(m,I),I}function s(m,I){y!==void 0&&(m.emitTimestamps=m.emitTimestamps.filter(H=>I-H<S))}function A(m,I){return(I.kind==="state"||I.kind==="diagnostic")&&!m.authoritative?!1:Ne(m.emit,I.type)}function C(m){for(let I of E)if(Ne(I.patterns,m.type))try{I.listener(m)}catch{}}function D(m){let I=[];if(m.target){let H=x.get(m.target);return!H||!Ne(H.subscribe,m.type)||(H.channel.dispatch(m),H.lastDelivered={id:m.id,hops:m.hops,correlationId:m.correlationId,idempotencyKey:m.idempotencyKey},I.push(H.id)),I}for(let H of x.values())Ne(H.subscribe,m.type)&&(H.channel.dispatch(m),H.lastDelivered={id:m.id,hops:m.hops,correlationId:m.correlationId,idempotencyKey:m.idempotencyKey},I.push(H.id));return I}function N(m,I,H,G,j,Q,le){let se={reason:G,eventType:I,source:H};j&&(se.detail=j),u+=1;let he=F(),we={schemaVersion:Et,type:Je,kind:"diagnostic",source:n,id:he,correlationId:Q??he,seq:u,hops:0,payload:se};le&&(we.causationId=le),O(we);let Ze=x.get(m);Ze&&Ze.channel.dispatch(we),C(we)}function J(m,I,H,G,j){if(N(m,j?.type??(typeof I.type=="string"?I.type:""),j?.source??m,H,G,j?.correlationId,j?.id),j?.idempotencyKey&&!uo.has(H)&&v(j,{status:"rejected"}),j)te(_(j,{outcome:"rejected",reason:H,detail:G,source:m,deliveredTo:[]}));else{let Q={outcome:"rejected",reason:H,source:m,type:typeof I.type=="string"?I.type:"",deliveredTo:[],turn:R,time:g()};G&&(Q.detail=G),typeof I.idempotencyKey=="string"&&(Q.idempotencyKey=I.idempotencyKey),te(Q)}}function X(m,I){O(m),v(m,{status:"accepted",envelope:m}),$(m.correlationId),C(m);let H=D(m);te(_(m,{outcome:"accepted",source:I,deliveredTo:H}))}function z(m,I,H,G){let j=G?.type??(typeof I.type=="string"?I.type:""),Q={outcome:"duplicate",reason:"duplicate",detail:H.status==="accepted"?"idempotent accepted":"idempotent rejected",source:m,type:j,deliveredTo:[],turn:R,time:g()};G?(Q.kind=G.kind,Q.envelopeId=G.id,Q.hops=G.hops,Q.seq=G.seq,Q.correlationId=G.correlationId,Q.schemaVersion=G.schemaVersion,G.target&&(Q.target=G.target),G.causationId&&(Q.causationId=G.causationId),G.idempotencyKey&&(Q.idempotencyKey=G.idempotencyKey),G.payload!==void 0&&(Q.payload=B(G.payload))):typeof I.idempotencyKey=="string"&&(Q.idempotencyKey=I.idempotencyKey),H.status==="accepted"&&(Q.priorEnvelopeId=H.envelope.id,Q.envelopeId||(Q.envelopeId=H.envelope.id)),te(Q)}function ee(m,I,H,G){if(!H.ok){J(m,I,"malformed",H.detail);return}let j=H.envelope,Q=P(j);if(Q)return z(m,I,Q,j),Q.status==="accepted"?Q.envelope:void 0;if(j.hops<1){J(m,I,"hop-limit","no hops remaining",j);return}if(j.target&&j.target!==t){let le=x.get(j.target);if(!le){J(m,I,"unknown-target",`unknown target "${j.target}"`,j);return}if(!Ne(le.subscribe,j.type)){J(m,I,"not-subscribed",`target "${j.target}" does not subscribe to ${j.type}`,j);return}}if(G){if(!A(G,j)){J(m,I,"unauthorized","source may not emit this event",j);return}if(G.emitsThisTurn+=1,G.emitsThisTurn>r){J(m,I,"rate-limited","maxPerTurn exceeded",j);return}if(y!==void 0){let se=g();if(s(G,se),G.emitTimestamps.push(se),G.emitTimestamps.length>y){J(m,I,"rate-limited","maxPerWindow exceeded",j);return}}if(K(j)){J(m,I,"loop-detected","causation chain cycle or depth exceeded",j);return}if((W.get(j.correlationId)??0)+1>a){J(m,I,"storm-detected","correlationId storm",j);return}if(e.validate){let se;try{se=e.validate(j)}catch(he){let we=he instanceof Error?he.message:"validate threw";J(m,I,"host-rejected",we,j);return}if(se!==!0){J(m,I,"host-rejected",se.detail,j);return}}}else{if(K(j)){J(m,I,"loop-detected","causation chain cycle or depth exceeded",j);return}if((W.get(j.correlationId)??0)+1>a){J(m,I,"storm-detected","correlationId storm",j);return}}return X(j,m),j}function ie(m,I){let H=x.get(m);if(!H)return;let G={...I},j=L(H,G);M(G,j);let Q=w(H.id,G.idempotencyKey);if(Q){z(m,G,Q);return}let le=T(H),se=on(G,{source:H.id,createId:F,seq:le,causationId:j?.id,maxHops:o,parentHops:Z(G.causationId??j?.id,j?.hops)});ee(m,G,se,H)}function ve(m,I){let H=I?.cause,G={...m};M(G,H);let j=w(t,G.idempotencyKey);if(j)return z(t,G,j),j.status==="accepted"?j.envelope:void 0;c+=1;let Q=on(G,{source:t,createId:F,seq:c,causationId:G.causationId,maxHops:o,parentHops:Z(G.causationId,H?.hops)});return ee(t,G,Q,void 0)}function xe(){if(!q){q=!0;try{for(;Y.length>0;){let m=Y.shift();m&&(m.kind==="cart"?ie(m.participantId,m.event):m.result=ve(m.event,m.extras))}}finally{q=!1}}}function Ce(m){Y.push(m),xe()}return{attach(m,I,H={}){if(m===t||m===n)throw new Error(`createEventRouter: "${m}" is a reserved participant id`);for(let Q of x.values())if(Q.channel===I&&Q.id!==m)throw new Error(`createEventRouter: channel already attached as "${Q.id}"`);x.get(m)?.unsubscribe();let j={id:m,channel:I,emit:H.emit??ho,subscribe:H.subscribe??[],authoritative:H.authoritative===!0,seq:0,emitsThisTurn:0,emitTimestamps:[],unsubscribe:()=>{}};j.unsubscribe=I.onEvent(Q=>{Ce({kind:"cart",participantId:m,event:Q})}),x.set(m,j)},detach(m){let I=x.get(m);I&&(I.unsubscribe(),x.delete(m))},publish(m,I){let H={kind:"publish",event:m,extras:I};return Ce(H),H.result},subscribe(m,I){let H={patterns:m,listener:I};return E.push(H),()=>{let G=E.indexOf(H);G>=0&&E.splice(G,1)}},subscribeDecision(m){return V.push(m),()=>{let I=V.indexOf(m);I>=0&&V.splice(I,1)}},inspectParticipants(){return[...x.values()].map(m=>({id:m.id,emit:m.emit.slice(),subscribe:m.subscribe.slice(),authoritative:m.authoritative}))},inspectDecisions(){return b.map(m=>B(m))},turn(){R+=1,W.clear();for(let m of x.values())m.emitsThisTurn=0,m.lastDelivered=void 0,y!==void 0&&s(m,g())}}}var go=320,yo=180,bo=1024,vo="Runtime group has been destroyed";function So(e){let t="";for(let n=0;n<32;n++){let r=e.charCodeAt(n%Math.max(e.length,1))+n*17&255;t+=r.toString(16).padStart(2,"0")}return`0x${t}`}function Eo(e,t){let n=document.createElement("div");return Object.defineProperty(n,"clientWidth",{value:e,configurable:!0}),Object.defineProperty(n,"clientHeight",{value:t,configurable:!0}),document.body.appendChild(n),n}function wr(e){let t=e.capability,n={},r=e.emit??t?.emit,i=e.subscribe??t?.subscribe,o=e.authoritative??t?.authoritative;return r&&(n.emit=r),i&&(n.subscribe=i),o!==void 0&&(n.authoritative=o),n}function Cr(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Ao(e){let t=new Set([Je,"*.*","*.*.*","*.*.*.*","*.*.*.*.*"]);for(let n of e){let r=wr(n);for(let i of r.emit??[])t.add(i);for(let i of r.subscribe??[])t.add(i)}return[...t]}function kr(e){if(!e.participants.length)throw new Error("createRuntimeGroup: at least one participant is required");let t=new Set;for(let u of e.participants){if(!u.id)throw new Error("createRuntimeGroup: participant id is required");if(t.has(u.id))throw new Error(`createRuntimeGroup: duplicate participant id "${u.id}"`);t.add(u.id)}let n=e.origin??0,r=e.width??go,i=e.height??yo,o=e.maxTrace??bo,a=[...e.participants].sort((u,R)=>u.id.localeCompare(R.id)),d=[],h=new Map,y=0,S=e.createId??e.router?.createId??(()=>`evt-${++y}`),g=e.now??e.router?.now??(()=>{let u=d[0];if(!u)return n;try{return u.cart.getClock().now}catch{return n}}),k=Ar({...e.router,createId:S,now:g,validate:e.validate??e.router?.validate}),F=[],x=!1,E=!1,V=()=>{},U=u=>R=>{u.events.push(R),u.userOnEvent?.(R)},W=()=>{if(E)throw new Error(vo)},p=()=>{V();for(let u of d){try{k.detach(u.id)}catch{}try{u.runtime.destroy()}catch{}u.ownsContainer&&u.container.remove()}d.length=0,h.clear()};try{for(let u of a){let R=u.width??r,B=u.height??i,te=!u.container,_=u.container??Eo(R,B),Y=vt({container:_,seed:u.seed??So(u.id),deterministic:{origin:n},audioBroker:e.audioBroker,audioParticipantId:e.audioBroker?u.id:void 0,kind:u.kind??"render"}),q={id:u.id,kind:u.kind??"render",cartDef:u.cart,initialState:u.initialState,gameManager:u.gameManager,userOnEvent:u.onEvent,runtime:Y,container:_,ownsContainer:te,cart:void 0,events:[],errors:[]};Y.onError=(f,O)=>{q.errors.push({error:f,info:O})},k.attach(u.id,Y.hostChannel,wr(u)),q.cart=Y.mount(u.cart,{initialState:u.initialState,gameManager:u.gameManager,onEvent:U(q)}),d.push(q),h.set(q.id,q)}V=k.subscribe(Ao(a),u=>{for(F.push(Cr(u));F.length>o;)F.shift()})}catch(u){throw p(),u}let b=u=>({id:u.id,kind:u.kind,runtime:u.runtime,container:u.container,get events(){return u.events.slice()},get errors(){return u.errors.slice()},get cart(){return u.cart}});return{router:k,origin:n,get paused(){return x},get audioBroker(){return e.audioBroker},participant(u){W();let R=h.get(u);if(!R)throw new Error(`createRuntimeGroup: unknown participant "${u}"`);return b(R)},async step(u=1){if(W(),x)return;let R=Math.max(0,Math.floor(u));for(let B=0;B<R;B++){k.turn();for(let te of d)try{await te.cart.step(1)}catch(_){te.errors.push({error:_,info:{phase:"update",consecutive:te.errors.length+1,stopped:!1}})}}},pause(){W(),x=!0;for(let u of d)u.cart.pause()},resume(){W(),x=!1;for(let u of d)u.cart.resume()},reset(){W(),F.length=0;for(let u of d)u.events.length=0,u.errors.length=0,u.cart=u.runtime.mount(u.cartDef,{initialState:u.initialState,gameManager:u.gameManager,onEvent:U(u)});k.turn()},resize(u,R){W();let B=Math.max(1,u|0),te=Math.max(1,R|0);for(let _ of d){Object.defineProperty(_.container,"clientWidth",{value:B,configurable:!0}),Object.defineProperty(_.container,"clientHeight",{value:te,configurable:!0});let Y=_.cart.canvas;Y&&(Y.width=B,Y.height=te)}},detach(u){W();let R=h.get(u);if(!R)throw new Error(`createRuntimeGroup: unknown participant "${u}"`);try{k.detach(R.id)}catch{}try{R.runtime.destroy()}catch{}e.audioBroker&&e.audioBroker.teardown(R.id),R.ownsContainer&&R.container.remove();let B=d.indexOf(R);B>=0&&d.splice(B,1),h.delete(u)},dispatch(u,R){W();let B=h.get(u);if(!B)throw new Error(`createRuntimeGroup: unknown participant "${u}"`);B.cart.dispatch(R)},publish(u,R){return W(),k.publish(u,R)},inspectParticipants(){W();let u=new Map(d.map(R=>[R.id,R.kind]));return k.inspectParticipants().map(R=>({...R,kind:u.get(R.id)??"render"}))},async inspect(){W();let u={},R={},B=new Map(k.inspectParticipants().map(_=>[_.id,_]));for(let _ of d){let Y=await _.cart.getReplayMetadata(),q=_.cart.getClock();R[_.id]=q;let f=B.get(_.id);u[_.id]={state:Y.state,events:_.events.slice(),errors:_.errors.slice(),kind:_.kind,clock:q,emit:f?.emit.slice()??[],subscribe:f?.subscribe.slice()??[],authoritative:f?.authoritative===!0}}let te=F.map(_=>Cr(_));return{participants:u,trace:te,diagnostics:{paused:x,participantIds:d.map(_=>_.id),clocks:R,rejections:te.filter(_=>_.type===Je).map(_=>_.payload)}}},destroy(){if(!E){E=!0,x=!1;try{p()}finally{F.length=0}}}}}function Co(e){return St(),kr(e)}var sn=1,wo=512,ko="[REDACTED]",Ro=new Set([Ee,Ae]);function ce(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function At(e,t){if(e==null)return e;if(Array.isArray(e))return e.map(i=>At(i,t));if(typeof e!="object")return e;let n=e,r={};for(let[i,o]of Object.entries(n))r[i]=t.has(i)?ko:At(o,t);return r}function xo(e){return e instanceof Error&&typeof e.message=="string"?e.message:"error"}function Io(e,t){return t?!(t.types&&!t.types.includes(e.type)||t.sources&&!t.sources.includes(e.source)||t.outcomes&&!t.outcomes.includes(e.outcome)||t.correlationId&&e.correlationId!==t.correlationId):!0}function Rr(e){return JSON.stringify({outcome:e.outcome,reason:e.reason,source:e.source,target:e.target,type:e.type,kind:e.kind,envelopeId:e.envelopeId,priorEnvelopeId:e.priorEnvelopeId,correlationId:e.correlationId,causationId:e.causationId,hops:e.hops,seq:e.seq,idempotencyKey:e.idempotencyKey,deliveredTo:e.deliveredTo,payload:e.payload})}function To(e,t){if(e.length!==t.length)return{ok:!1,detail:`record count ${t.length} !== ${e.length}`};for(let n=0;n<e.length;n++){let r=Rr(e[n]),i=Rr(t[n]);if(r!==i)return{ok:!1,detail:`record ${n} differs`}}return{ok:!0}}function xr(e){let t=new Map,n=[];for(let o of e){if(o.outcome==="duplicate"){n.push(void 0);continue}let a={envelopeId:o.envelopeId,type:o.type,source:o.source,outcome:o.outcome,children:[]};o.reason&&(a.reason=o.reason),n.push(a),o.envelopeId&&!t.has(o.envelopeId)&&t.set(o.envelopeId,a)}let r=new Set;for(let o=0;o<e.length;o++){let a=e[o],d=n[o];if(!d)continue;let h=a.causationId?t.get(a.causationId):void 0;h&&h!==d&&(h.children.push(d),r.add(d))}let i=[];for(let o of n)o&&!r.has(o)&&i.push(o);return i}function Ir(e,t){let n={id:e.id,emit:e.emit.slice(),subscribe:e.subscribe.slice(),authoritative:e.authoritative,errorCount:0};return t&&(n.kind=t),n}function Po(e,t,n){let r=t.errors[t.errors.length-1],i={id:e,kind:t.kind,emit:t.emit.slice(),subscribe:t.subscribe.slice(),authoritative:t.authoritative,clock:ce(t.clock),state:At(t.state,n),errorCount:t.errors.length};return r&&(i.lastError=xo(r.error)),i}function Tr(e={}){let t=new Set(e.redactedKeys??[]),n=e.maxRecords??wo,r=e.registry,i=0,o=0,a=!1,d=[],h=[],y,S=[],g=0,k=[],F={},x=()=>{},E=()=>{if(a)throw new Error("Replay inspector has been destroyed")},V=b=>{let c=r?.get(b.type),u={index:o,turn:b.turn,time:b.time,outcome:b.outcome,source:b.source,type:b.type,deliveredTo:b.deliveredTo.slice(),payload:At(b.payload,t)};for(o+=1,b.reason&&(u.reason=b.reason),b.detail&&(u.detail=b.detail),b.target&&(u.target=b.target),b.kind&&(u.kind=b.kind),b.envelopeId&&(u.envelopeId=b.envelopeId),b.priorEnvelopeId&&(u.priorEnvelopeId=b.priorEnvelopeId),b.correlationId&&(u.correlationId=b.correlationId),b.causationId&&(u.causationId=b.causationId),b.hops!==void 0&&(u.hops=b.hops),b.seq!==void 0&&(u.seq=b.seq),b.idempotencyKey&&(u.idempotencyKey=b.idempotencyKey),b.schemaVersion!==void 0&&(u.schemaVersion=b.schemaVersion),c&&(u.payloadSchemaVersion=c.payloadSchema.version),d.push(u);d.length>n;)d.shift(),i+=1},U=b=>d.filter(c=>Io(c,b)).map(c=>ce(c)),W=b=>b?b.inspectParticipants().map(c=>Ir(c,c.kind)):k.map(c=>ce(c)),p={watchRouter(b){if(E(),x(),k=b.inspectParticipants().map(u=>Ir(u)),d.length===0)for(let u of b.inspectDecisions())V(u);let c=b.subscribeDecision(u=>V(u));return x=()=>{c(),x=()=>{}},h.push(x),x},bind(b){E(),y&&x(),y=b,g=b.origin,p.watchRouter(b.router),k=W(b);let c={publish(u,R){E();let B={kind:"publish",event:ce(u)};return R?.cause&&(B.extras={cause:ce(R.cause)}),S.push(B),b.publish(u,R)},dispatch(u,R){E();let B=ce(R);typeof B.type=="string"&&Ro.has(B.type)?S.push({kind:"asset",participantId:u,event:B}):S.push({kind:"dispatch",participantId:u,event:B}),b.dispatch(u,R)},async step(u=1){E(),S.push({kind:"step",frames:u}),await b.step(u)},async report(){E();let u=await b.inspect(),R=[];for(let B of Object.keys(u.participants).sort())R.push(Po(B,u.participants[B],t));k=R,F={};for(let B of R)F[B.id]=ce(B.state);return p.report()},async exportTrace(u){return await c.report(),p.exportTrace(u)},unbind(){x(),y=void 0}};return c},importTrace(b){E();let c=typeof b=="string"?JSON.parse(b):b;if(c.schemaVersion!==sn)throw new Error("Replay inspector: unsupported export schemaVersion");i=0,o=0,d.length=0,S=ce(c.tape??[]),g=c.origin??0,k=ce(c.participants??[]),F=ce(c.snapshots??{});for(let u of c.records??[])V({outcome:u.outcome,reason:u.reason,detail:u.detail,source:u.source,type:u.type,kind:u.kind,envelopeId:u.envelopeId,priorEnvelopeId:u.priorEnvelopeId,target:u.target,deliveredTo:u.deliveredTo,hops:u.hops,seq:u.seq,correlationId:u.correlationId,causationId:u.causationId,idempotencyKey:u.idempotencyKey,schemaVersion:u.schemaVersion,payload:u.payload,turn:u.turn,time:u.time})},exportTrace(b){return E(),{schemaVersion:sn,origin:g,redactedKeys:[...t],participants:ce(k),tape:ce(S),records:U(b),snapshots:ce(F)}},report(b){E();let c=U(b);return{schemaVersion:sn,participants:ce(k),records:c,trees:xr(c),dropped:i}},causationTree(b){E();let c=U(b?{correlationId:b}:void 0);return xr(c)},records(){return E(),d.map(b=>ce(b))},reset(){E(),d.length=0,S=[],i=0,o=0,F={},y&&(k=W(y))},destroy(){if(!a){for(a=!0,x();h.length>0;)h.pop()?.();d.length=0,S=[],k=[],F={},y=void 0}}};return p}async function Do(e,t,n={}){let r=Tr({redactedKeys:n.redactedKeys??e.redactedKeys,maxRecords:n.maxRecords,registry:n.registry}),i=r.bind(t);try{for(let a of e.tape)a.kind==="publish"?i.publish(a.event,a.extras):a.kind==="dispatch"||a.kind==="asset"?i.dispatch(a.participantId,a.event):await i.step(a.frames);let o=await i.report();return{inspector:r,report:o}}catch(o){throw r.destroy(),o}}var Ke="cue.started",Xe="cue.completed",Ue="cue.cancelled",Ie="cue.replaced";function Mo(e,t){let n=e<0?0:e>1?1:e;return t==="ease-out"?1-(1-n)*(1-n):n}function Pr(e){return{type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,progress:e.progress}}function Ct(e){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:e.phase,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,progress:e.progress,repeatIndex:e.repeatIndex}}function an(e){return e.startFrame+e.delayFrames}function Lo(e,t){if(!e||typeof e!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof e.name!="string"||e.name.length===0)return{ok:!1,reason:"invalid",detail:"name is required"};if(typeof e.idempotencyKey!="string"||e.idempotencyKey.length===0)return{ok:!1,reason:"invalid",detail:"idempotencyKey is required"};if(typeof e.durationFrames!="number"||!Number.isFinite(e.durationFrames)||e.durationFrames<0)return{ok:!1,reason:"invalid",detail:"durationFrames must be a non-negative finite number"};let n=e.startFrame===void 0?t:e.startFrame;if(typeof n!="number"||!Number.isFinite(n))return{ok:!1,reason:"invalid",detail:"startFrame must be finite"};let r=e.delayFrames??0;if(typeof r!="number"||!Number.isFinite(r)||r<0)return{ok:!1,reason:"invalid",detail:"delayFrames must be a non-negative finite number"};let i=e.easing??"linear";if(i!=="linear"&&i!=="ease-out")return{ok:!1,reason:"invalid",detail:"unsupported easing"};let o=e.onDuplicate??"replace";if(o!=="ignore"&&o!=="replace"&&o!=="reject")return{ok:!1,reason:"invalid",detail:"unsupported onDuplicate"};let a=0;if(e.repeat)if("forever"in e.repeat&&e.repeat.forever)a="forever";else if("count"in e.repeat){if(typeof e.repeat.count!="number"||!Number.isFinite(e.repeat.count)||e.repeat.count<0)return{ok:!1,reason:"invalid",detail:"repeat.count must be >= 0"};a=Math.floor(e.repeat.count)}else return{ok:!1,reason:"invalid",detail:"unsupported repeat"};let d=e.reducedMotion??"complete";return d!=="skip"&&d!=="complete"&&(typeof d!="object"||typeof d.durationFrames!="number"||!Number.isFinite(d.durationFrames)||d.durationFrames<0)?{ok:!1,reason:"invalid",detail:"unsupported reducedMotion"}:{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:n,durationFrames:e.durationFrames,delayFrames:r,easing:i,repeatRemaining:a,repeatIndex:0,reducedMotion:d,onDuplicate:o,phase:"scheduled",progress:0}}function Vo(e,t){if(!t)return e;let n=e.reducedMotion;return n==="skip"||n==="complete"?{...e,durationFrames:0,delayFrames:0,startFrame:e.startFrame}:{...e,durationFrames:n.durationFrames}}function Qe(e={}){let t=!!e.reducedMotion,n=e.originFrame??0,r=new Map,i=[];function o(E){i.push(E)}function a(E,V){let U=an(E)-an(V);return U!==0?U:E.name<V.name?-1:E.name>V.name?1:E.idempotencyKey<V.idempotencyKey?-1:E.idempotencyKey>V.idempotencyKey?1:0}function d(E,V){o({type:V,atFrame:n,name:E.name,idempotencyKey:E.idempotencyKey,progress:E.progress})}function h(E){if(E.phase="completed",E.progress=1,d(E,Xe),E.repeatRemaining==="forever"||E.repeatRemaining>0){if(typeof E.repeatRemaining=="number"&&(E.repeatRemaining-=1),E.repeatIndex+=1,E.phase="scheduled",E.progress=0,E.startFrame=n,E.delayFrames=0,E.durationFrames===0){r.delete(E.idempotencyKey);return}E.phase="active",d(E,Ke)}else r.delete(E.idempotencyKey)}function y(E){if(E.phase==="cancelled"||E.phase==="completed")return;let V=an(E);if(!(n<V)){if(E.phase==="scheduled"&&(E.phase="active",E.progress=E.durationFrames===0?1:0,d(E,Ke),E.durationFrames===0)){h(E);return}if(E.phase==="active"){let U=n-V;U>=E.durationFrames?(E.progress=1,h(E)):E.progress=Mo(E.durationFrames===0?1:U/E.durationFrames,E.easing)}}}function S(){let E=[...r.values()].sort(a);for(let V of E)y(V)}function g(E){let V=Lo(E,n);if("ok"in V&&V.ok===!1)return V;let U=Vo(V,t),W=r.get(U.idempotencyKey);if(W&&(W.phase==="scheduled"||W.phase==="active")){if(W.onDuplicate==="reject"||U.onDuplicate==="reject")return{ok:!1,reason:"duplicate",detail:`cue ${U.idempotencyKey} is already ${W.phase}`};if(W.onDuplicate==="ignore"||U.onDuplicate==="ignore")return{ok:!0,cue:Ct(W)};W.phase="cancelled",W.progress=W.progress,d(W,Ie),r.delete(W.idempotencyKey)}r.set(U.idempotencyKey,U),y(U);let p=r.get(U.idempotencyKey)??U;return{ok:!0,cue:Ct(p)}}function k(E){let V=r.get(E);return!V||V.phase==="completed"||V.phase==="cancelled"?!1:(V.phase="cancelled",d(V,Ue),r.delete(E),!0)}function F(){for(let E of[...r.values()].sort(a))(E.phase==="scheduled"||E.phase==="active")&&(E.phase="cancelled",d(E,Ue));r.clear(),i.length=0,n=e.originFrame??0}function x(E=1){let V=Number.isFinite(E)?Math.max(0,Math.floor(E)):0,U=i.length;for(let W=0;W<V;W++)n+=1,S();return i.slice(U).map(Pr)}return{play:g,step:x,cancel:k,reset:F,snapshot(){return{frame:n,reducedMotion:t,cues:[...r.values()].sort(a).map(Ct),events:i.map(Pr)}},get(E){let V=r.get(E);return V?Ct(V):void 0},get frame(){return n},get reducedMotion(){return t}}}var Fo="audio.cue.scheduled",Ho="audio.cue.started",Oo="audio.cue.skipped",_o="audio.cue.failed";function dn(e){let t={type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,assetId:e.assetId,channelId:e.channelId,progress:e.progress};return e.participantId!==void 0&&(t.participantId=e.participantId),e.reason!==void 0&&(t.reason=e.reason),t}function No(e){return{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,repeat:e.repeat,reducedMotion:e.reducedMotion,onDuplicate:e.onDuplicate}}function wt(e,t,n){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:t?.phase??(e.audioPhase==="started"?"active":"scheduled"),startFrame:t?.startFrame??n,durationFrames:t?.durationFrames??0,delayFrames:t?.delayFrames??0,easing:t?.easing??"linear",progress:t?.progress??0,repeatIndex:t?.repeatIndex??0,assetId:e.assetId,channelId:e.channelId,participantId:e.participantId,priority:e.priority,audioPhase:e.audioPhase}}function Ko(e={}){let t=e.broker,n=!!(e.reducedSensory??t?.reducedSensory),r=Qe({originFrame:e.originFrame}),i=new Map,o=[],a=new Set,d=0;function h(c){o.push(c)}function y(c,u,R){let B=r.get(u.idempotencyKey);return dn({type:c,atFrame:r.frame,name:u.name,idempotencyKey:u.idempotencyKey,assetId:u.assetId,channelId:u.channelId,participantId:u.participantId,reason:R?.reason,progress:R?.progress??B?.progress??0})}function S(c,u){a.delete(c.idempotencyKey),t?.noteCueEnded(c.idempotencyKey),c.audioPhase="failed",h(y(_o,c,{reason:u})),r.cancel(c.idempotencyKey),i.delete(c.idempotencyKey)}function g(c,u){a.delete(c.idempotencyKey),c.audioPhase="skipped",h(y(Oo,c,{reason:u}))}function k(c){a.delete(c.idempotencyKey),c.audioPhase="started",t?.noteCueStarted({idempotencyKey:c.idempotencyKey,channelId:c.channelId,participantId:c.participantId,priority:c.priority}),h(y(Ho,c))}function F(c){if(c.audioPhase!=="scheduled")return;if(t&&!t.isAuthorized(c.participantId)){g(c,"unauthorized"),r.cancel(c.idempotencyKey),i.delete(c.idempotencyKey);return}if(n||t?.reducedSensory){g(c,"reduced-sensory");return}if(t?.muted||t&&t.effectiveGain(c.channelId)===0){g(c,"muted");return}let u=t?.assetStatus(c.assetId);if(!t){k(c);return}if(u==="failed"){S(c,"asset-failed");return}if(u==="ready"){k(c);return}a.add(c.idempotencyKey)}function x(c,u){for(let R of[...a]){let B=i.get(R);if(!B){a.delete(R);continue}if(!(c&&B.assetId!==c)){if(u==="failed"||t?.assetStatus(B.assetId)==="failed"){S(B,"asset-failed");continue}(u==="ready"||t?.assetStatus(B.assetId)==="ready")&&F(B)}}}function E(c){for(let u of[...i.values()])u.participantId===c&&(u.audioPhase==="scheduled"||u.audioPhase==="started")&&S(u,"torn-down")}function V(c){for(let u of c){let R=i.get(u.idempotencyKey);if(R)if(u.type===Ke)F(R);else if(u.type===Xe){if(a.delete(R.idempotencyKey),t?.noteCueEnded(R.idempotencyKey),r.get(R.idempotencyKey)){R.audioPhase="scheduled";continue}R.audioPhase==="scheduled"?S(R,"asset-failed"):(R.audioPhase==="started"&&(R.audioPhase="completed"),i.delete(R.idempotencyKey))}else u.type===Ue?(a.delete(R.idempotencyKey),t?.noteCueEnded(R.idempotencyKey),(R.audioPhase==="scheduled"||R.audioPhase==="started")&&(R.audioPhase="failed"),i.delete(R.idempotencyKey)):u.type===Ie&&(a.delete(R.idempotencyKey),t?.noteCueEnded(R.idempotencyKey),i.delete(R.idempotencyKey))}}function U(){let c=o.slice(d).map(dn);return d=o.length,c}let W=t?.onNotice(c=>{if(c.type==="asset"){if(c.status==="failed"){for(let u of[...i.values()])u.assetId===c.id&&(u.audioPhase==="scheduled"||u.audioPhase==="started")&&S(u,"asset-failed");return}x(c.id,c.status);return}if(c.type==="teardown"){E(c.participantId);return}if(c.type==="destroy")for(let u of[...i.values()])(u.audioPhase==="scheduled"||u.audioPhase==="started")&&S(u,"torn-down")});function p(){for(let c of i.values())t?.noteCueEnded(c.idempotencyKey);i.clear(),a.clear(),o.length=0,d=0,r.reset()}function b(c){if(!c||typeof c!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof c.assetId!="string"||c.assetId.length===0)return{ok:!1,reason:"invalid",detail:"assetId is required"};let u=r.snapshot().events.length,R=r.play(No(c));if(!R.ok)return R;let B=r.snapshot().events.slice(u),te=B.some(M=>M.type===Ie);if(!te&&i.has(c.idempotencyKey)){let M=i.get(c.idempotencyKey);return{ok:!0,cue:wt(M,R.cue,r.frame)}}if(te){let M=i.get(c.idempotencyKey);M&&(a.delete(M.idempotencyKey),t?.noteCueEnded(M.idempotencyKey),i.delete(M.idempotencyKey))}let _=c.channelId??c.participantId??"master",Y={name:c.name,idempotencyKey:c.idempotencyKey,assetId:c.assetId,channelId:_,participantId:c.participantId,priority:Number.isFinite(c.priority)?c.priority:0,audioPhase:"scheduled"};i.set(Y.idempotencyKey,Y),typeof c.gain=="number"&&t?.setChannelGain(_,c.gain,c.participantId),typeof c.priority=="number"&&t?.setPriority(_,c.priority,c.participantId),h(y(Fo,Y)),V(B.filter(M=>M.type!==Ie));let q=i.get(Y.idempotencyKey);q&&q.audioPhase==="scheduled"&&t?.assetStatus(q.assetId)==="failed"&&S(q,"asset-failed"),U();let f=i.get(Y.idempotencyKey)??Y,O=r.get(Y.idempotencyKey)??R.cue;return{ok:!0,cue:wt(f,O,r.frame)}}return{play:b,step(c=1){let u=r.step(c);return V(u),U()},cancel(c){let u=i.get(c),R=r.cancel(c);return u&&(a.delete(c),t?.noteCueEnded(c),i.delete(c)),R},reset:p,snapshot(){return{frame:r.frame,reducedSensory:n,cues:[...i.values()].map(c=>wt(c,r.get(c.idempotencyKey),r.frame)).sort((c,u)=>c.name!==u.name?c.name<u.name?-1:1:c.idempotencyKey<u.idempotencyKey?-1:c.idempotencyKey>u.idempotencyKey?1:0),events:o.map(dn)}},get(c){let u=i.get(c);if(u)return wt(u,r.get(c),r.frame)},dispose(){W?.(),p()},get frame(){return r.frame},get reducedSensory(){return n}}}function Uo(e={}){let t=ur({toneStart:async()=>{},reducedSensory:e.reducedSensory}),n=Ko({broker:t,originFrame:e.originFrame,reducedSensory:e.reducedSensory});return{broker:t,timeline:n,unlock(){return t.unlock()},play(r){return n.play(r)},step(r){return n.step(r)},handleHostEvent(r){t.handleHostEvent(r)},snapshot(){return{...n.snapshot(),unlock:t.status(),muted:t.muted}},destroy(){n.dispose(),t.destroy()}}}var Dr=1,Bo=["layer","mask","sprite"],$o=["show","hide","replace","crossfade"],Go=":incoming",jo="visual.layer.revealed",Mr="visual.layer.hidden",Wo="visual.layer.transition-started",zo="visual.layer.transition-completed",Lr="visual.layer.failed";var qo="host.state.accepted";var Yo="Visual layer controller has been destroyed",Jo=new Set(Bo),Xo=new Set($o);function Qo(e){return typeof e=="string"&&Jo.has(e)}function Zo(e){return typeof e=="string"&&Xo.has(e)}function es(e){return`${e}${Go}`}function ts(e){return{frame:e.captureComposedFrame(),layers:e.inspect()}}function ns(e){return{data:new Uint8ClampedArray(e.data),width:e.width,height:e.height,colorSpace:e.colorSpace??"srgb"}}function Be(e){return JSON.parse(JSON.stringify(e))}function kt(e){if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function rs(e){let t=kt(e);return typeof t?.id=="string"&&t.id.length>0?t.id:void 0}function is(e){if(!e||typeof e!="object")return;let t=e;if(!(typeof t.id!="string"||typeof t.ref!="string"||typeof t.code!="string"||typeof t.message!="string"))return t}function me(e,t){if(t)return e.versions.find(n=>n.id===t)}function Vr(e){return e?{...e}:null}function os(e){if(!e?.compositor)throw new Error("createVisualLayerController: compositor is required");if(!e.layers?.length)throw new Error("createVisualLayerController: at least one layer is required");let t=e.compositor,n=e.preloader,r=!!e.reducedMotion,i=e.fallback??"keep-prior",o=Qe({originFrame:e.originFrame,reducedMotion:r}),a=e.sceneId??null,d=!1,h=0,y=new Map,S=new Map,g=new Map,k=new Map,F=[],x=[],E=()=>{if(d)throw new Error(Yo)};function V(s){F.push(s),e.dispatch&&e.dispatch({type:s.type,kind:s.type===Lr?"diagnostic":"state",payload:s})}function U(s){x.push(s),V({type:Lr,atFrame:s.atFrame,layerId:s.layerId,version:s.version,progress:0,code:s.code})}function W(s,A){g.set(s,A)}function p(s){let A=g.get(s);if(A)return A;if(n?.get(s))return"ready";let C=n?.getProgress().items[s];return C?.state==="failed"?"failed":C?.state==="ready"?"ready":"pending"}function b(s){let A=S.get(s);if(A)return A.kind==="canvas"?{kind:"canvas",canvas:A.canvas}:{kind:"image",image:A.image}}function c(s,A){let C=me(s.declaration,A);return C?p(C.assetId)==="ready"&&!!b(C.assetId):!1}function u(s){return s.overrideVersion&&c(s,s.overrideVersion)?s.overrideVersion:s.committedVersion}function R(s,A){let C=me(s.declaration,A);return C?Vr(k.get(C.assetId))??Vr(C.provenance)??null:null}function B(s,A=0){return o.get(s)?.progress??A}function te(s,A,C){try{t.layer(s)}catch{t.addLayer({id:s,order:A,visible:!1,opacity:0,pointerEvents:C.pointerEvents??"none",blend:C.blend,clip:C.clip??void 0,clearPolicy:C.clearPolicy})}}function _(s){try{t.setLayer(s.incomingLayerId,{visible:!1,opacity:0})}catch{}}function Y(){for(let s of y.values()){let A=u(s),C=me(s.declaration,A),D=s.transition,N=D?B(D.cueKey):0,J=D?.kind==="crossfade"&&D.toVersion!==null&&c(s,D.toVersion);te(s.compositorLayerId,s.order,s);let X=s.visible,z=1;D?.kind==="hide"?(z=1-N,N>=1&&(X=!1)):D?.kind==="show"?(X=c(s,D.toVersion),z=X?D.durationFrames===0?1:N:0):J&&(z=1-N);let ee=C?b(C.assetId):void 0;if(t.setLayer(s.compositorLayerId,{order:s.order,visible:X&&!!ee,opacity:z,blend:s.blend,clip:s.clip??void 0,pointerEvents:s.pointerEvents,clearPolicy:s.clearPolicy,source:ee}),J&&D){let ie=me(s.declaration,D.toVersion),ve=ie?b(ie.assetId):void 0;if(ve){try{t.layer(s.incomingLayerId)}catch{t.addLayer({id:s.incomingLayerId,order:s.order+1,visible:!1,opacity:0,pointerEvents:"none",blend:s.blend,clip:s.clip??void 0,clearPolicy:s.clearPolicy})}t.setLayer(s.incomingLayerId,{order:s.order+1,visible:!0,opacity:N,blend:s.blend,clip:s.clip??void 0,pointerEvents:"none",clearPolicy:s.clearPolicy,source:ve});continue}}_(s)}}function q(s){let A=u(s);return{id:s.declaration.id,kind:s.kind,visible:s.visible&&!!(A&&c(s,A)),activeVersion:A,pendingVersion:s.pendingVersion,committedVersion:s.committedVersion,opacity:t.layer(s.compositorLayerId).opacity,order:s.order,provenance:R(s,A),overrideVersion:s.overrideVersion,transition:s.transition?{kind:s.transition.kind,progress:B(s.transition.cueKey),fromVersion:s.transition.fromVersion,toVersion:s.transition.toVersion,cueKey:s.transition.cueKey,startFrame:s.transition.startFrame,durationFrames:s.transition.durationFrames,delayFrames:s.transition.delayFrames,easing:s.transition.easing}:null}}function f(s,A,C){s.committedVersion=A,s.pendingVersion=null,s.transition=null,s.visible=C,Y(),V({type:C?jo:Mr,atFrame:o.frame,layerId:s.declaration.id,version:A,progress:1})}function O(s){s.visible=!1,s.pendingVersion=null,s.transition=null,Y(),V({type:Mr,atFrame:o.frame,layerId:s.declaration.id,version:s.committedVersion??void 0,progress:1})}function M(s,A,C,D){let N=s.fallback;s.transition=null,s.pendingVersion=null,N==="hide"?s.visible=!1:typeof N=="object"&&N.version&&c(s,N.version)&&(s.committedVersion=N.version,s.visible=!0),Y(),U({code:D?"asset-failed":"missing-source",layerId:s.declaration.id,version:A??void 0,assetId:C,message:D?D.message:`visual layer "${s.declaration.id}" kept the prior valid frame`,atFrame:o.frame,failure:D})}function Z(s){let A=s.transition;if(A?.kind==="hide")return O(s),!0;let C=s.pendingVersion??A?.toVersion??null;if(!C)return s.transition=null,!0;if(!me(s.declaration,C))return M(s,C),!0;if(c(s,C))return f(s,C,!0),!0;let D=me(s.declaration,C).assetId;return p(D)==="failed"?(M(s,C,D),!0):(s.transition=null,s.pendingVersion=C,Y(),!1)}function l(){for(let s of y.values())if(!s.transition&&s.pendingVersion){if(c(s,s.pendingVersion))f(s,s.pendingVersion,!0);else if(p(me(s.declaration,s.pendingVersion)?.assetId??"")==="failed"){let A=me(s.declaration,s.pendingVersion);M(s,s.pendingVersion,A?.assetId)}}for(let s of y.values())s.overrideVersion&&c(s,s.overrideVersion)&&s.committedVersion!==s.overrideVersion&&f(s,s.overrideVersion,!0)}function v(s,A){W(s,"failed");for(let C of y.values()){let D=C.declaration.versions.find(ee=>ee.assetId===s);if(!D)continue;let N=me(C.declaration,C.pendingVersion),J=me(C.declaration,C.transition?.toVersion??null),X=me(C.declaration,C.overrideVersion);if(N?.assetId===s||J?.assetId===s||X?.assetId===s){C.transition&&o.cancel(C.transition.cueKey),X?.assetId===s&&(C.overrideVersion=null),M(C,D.id,s,A);continue}U({code:"asset-failed",layerId:C.declaration.id,version:D.id,assetId:s,message:A?.message??`asset "${s}" failed; prior frame kept`,atFrame:o.frame,failure:A}),Y()}}function w(s){for(let A of s){let C=[...y.values()].find(D=>D.transition?.cueKey===A.idempotencyKey);if(!(!C||!C.transition))if(A.type===Ke)V({type:Wo,atFrame:A.atFrame,layerId:C.declaration.id,version:C.transition.toVersion??void 0,kind:C.transition.kind,progress:A.progress}),Y();else if(A.type===Xe){let D=C.transition.kind,N=C.transition.toVersion??void 0;Z(C),V({type:zo,atFrame:A.atFrame,layerId:C.declaration.id,version:N,kind:D,progress:1})}else(A.type===Ue||A.type===Ie)&&(C.transition=null,Y())}}function P(){let s=F.slice(h).map(A=>Be(A));return h=F.length,s}for(let s of e.layers){if(!s?.id)throw new Error("createVisualLayerController: layer id is required");if(y.has(s.id))throw new Error(`createVisualLayerController: duplicate layer id "${s.id}"`);if(!Qo(s.kind))throw new Error(`createVisualLayerController: layer "${s.id}" kind is invalid`);if(!s.versions?.length)throw new Error(`createVisualLayerController: layer "${s.id}" needs versions`);let A=new Set;for(let z of s.versions){if(!z?.id||!z.assetId)throw new Error(`createVisualLayerController: layer "${s.id}" versions need id and assetId`);if(A.has(z.id))throw new Error(`createVisualLayerController: layer "${s.id}" duplicate version "${z.id}"`);A.add(z.id),z.provenance&&k.set(z.assetId,{...z.provenance})}if(s.initialVersion&&!A.has(s.initialVersion))throw new Error(`createVisualLayerController: layer "${s.id}" unknown initialVersion`);let C=s.compositorLayerId??s.id,D=s.incomingLayerId??es(C),N=s.order??0,J=s.pointerEvents??(s.kind==="mask"?"none":"auto"),X={declaration:s,compositorLayerId:C,incomingLayerId:D,kind:s.kind,order:N,blend:s.blend??"source-over",clip:s.clip?{...s.clip}:null,pointerEvents:J,clearPolicy:s.clearPolicy??"opaque",fallback:s.fallback??i,visible:!!s.initialVersion,committedVersion:s.initialVersion??null,pendingVersion:null,overrideVersion:null,transition:null};y.set(s.id,X),te(C,N,X)}Y();function T(s){if(E(),!s||typeof s!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(!s.layerId)return{ok:!1,reason:"invalid",detail:"layerId is required"};let A=y.get(s.layerId);if(!A)return{ok:!1,reason:"invalid",detail:`unknown layer "${s.layerId}"`};if(!Zo(s.kind))return{ok:!1,reason:"invalid",detail:"unsupported kind"};if(s.kind!=="hide"&&!s.toVersion)return{ok:!1,reason:"invalid",detail:"toVersion is required"};if(s.toVersion&&!me(A.declaration,s.toVersion))return{ok:!1,reason:"invalid",detail:`unknown version "${s.toVersion}"`};let C={name:s.name,idempotencyKey:s.idempotencyKey,startFrame:s.startFrame,durationFrames:s.durationFrames,delayFrames:s.delayFrames,easing:s.easing,repeat:s.repeat,reducedMotion:s.reducedMotion,onDuplicate:s.onDuplicate??"replace"},D=o.snapshot().events.length,N=o.play(C);if(!N.ok)return N;let J=o.snapshot().events.slice(D);return A.pendingVersion=s.kind==="hide"?A.committedVersion:s.toVersion??null,A.transition={kind:s.kind,cueKey:s.idempotencyKey,fromVersion:s.fromVersion??A.committedVersion,toVersion:s.kind==="hide"?A.committedVersion:s.toVersion??null,startFrame:N.cue.startFrame,durationFrames:N.cue.durationFrames,delayFrames:N.cue.delayFrames,easing:N.cue.easing},w(J),Y(),P(),N}function L(s){let A=kt(s),C=typeof A?.sceneId=="string"?A.sceneId:void 0;if(e.sceneId&&C&&C!==e.sceneId)return;C&&(a=C);let D=typeof A?.layerId=="string"?A.layerId:typeof A?.overlayId=="string"?A.overlayId:void 0,N=typeof A?.version=="string"?A.version:void 0;if(D&&N){T({name:`visual:${D}:replace`,idempotencyKey:`visual:${D}:accepted`,layerId:D,kind:"replace",toVersion:N,durationFrames:2});return}for(let J of e.onAccepted??[])T({name:`visual:${J.layerId}:${J.kind??"replace"}`,idempotencyKey:J.idempotencyKey??`visual:${J.layerId}:accepted`,layerId:J.layerId,kind:J.kind??"replace",toVersion:J.toVersion,durationFrames:J.durationFrames??2,delayFrames:J.delayFrames,easing:J.easing})}function K(){let s=[...y.values()].map(C=>{let D=q(C);return{id:C.declaration.id,kind:C.kind,visible:C.visible,committedVersion:C.committedVersion,pendingVersion:C.pendingVersion,activeVersion:D.activeVersion,opacity:D.opacity,order:C.order,overrideVersion:C.overrideVersion,provenance:D.provenance,fallback:C.fallback,transition:D.transition}}).sort((C,D)=>C.id<D.id?-1:C.id>D.id?1:0),A={};for(let[C,D]of[...g.entries()].sort(([N],[J])=>N<J?-1:N>J?1:0))A[C]=D;return Be({schemaVersion:Dr,frame:o.frame,sceneId:a,reducedMotion:r,layers:s,assets:A,events:F.map(C=>Be(C)),diagnostics:x.map(C=>Be(C))})}function $(s){E();let A=[],C=X=>{let z={code:"invalid-snapshot",layerId:"",message:X,atFrame:o.frame};return{ok:!1,errors:[...A,z]}},D=s;if(typeof s=="string")try{D=JSON.parse(s)}catch{return C("snapshot JSON is invalid")}if(!D||typeof D!="object"||Array.isArray(D))return C("snapshot must be an object");let N=D;if(N.schemaVersion!==Dr)return C("unsupported visual layer snapshot schema");if(typeof N.frame!="number"||!Number.isFinite(N.frame))return C("frame must be finite");if(!Array.isArray(N.layers))return C("layers must be an array");if(o=Qe({originFrame:N.frame,reducedMotion:r}),a=typeof N.sceneId=="string"||N.sceneId===null?N.sceneId:a,F.length=0,x.length=0,h=0,Array.isArray(N.events)&&(F.push(...N.events.map(X=>Be(X))),h=F.length),Array.isArray(N.diagnostics)&&x.push(...N.diagnostics.map(X=>Be(X))),g.clear(),N.assets&&typeof N.assets=="object")for(let[X,z]of Object.entries(N.assets))(z==="ready"||z==="failed"||z==="pending")&&g.set(X,z);let J=new Map(N.layers.map(X=>[X.id,X]));for(let X of y.values()){let z=J.get(X.declaration.id);z&&(X.visible=!!z.visible,X.committedVersion=z.committedVersion??null,X.pendingVersion=z.pendingVersion??null,X.overrideVersion=z.overrideVersion??null,X.transition=null,z.transition&&o.play({name:`visual:${X.declaration.id}:${z.transition.kind}`,idempotencyKey:z.transition.cueKey,startFrame:z.transition.startFrame,durationFrames:z.transition.durationFrames,delayFrames:z.transition.delayFrames,easing:z.transition.easing,onDuplicate:"replace"}).ok&&(X.transition={kind:z.transition.kind,cueKey:z.transition.cueKey,fromVersion:z.transition.fromVersion,toVersion:z.transition.toVersion,startFrame:z.transition.startFrame,durationFrames:z.transition.durationFrames,delayFrames:z.transition.delayFrames,easing:z.transition.easing}))}return Y(),{ok:!0,snapshot:K()}}return{registerSource(s,A){if(E(),typeof s!="string"||s.length===0)throw new Error("createVisualLayerController: assetId is required");if(A instanceof HTMLCanvasElement)S.set(s,{kind:"canvas",canvas:A});else if(A&&"data"in A&&"width"in A)S.set(s,{kind:"image",image:ns(A)});else throw new Error("createVisualLayerController: source must be ImageData or canvas");l(),Y()},handleHostEvent(s){if(E(),!s||typeof s!="object")return;if(s.type===qo){L(s.payload);return}let A=rs(s.payload);if(A){if(s.type===Ee){W(A,"ready");let D=kt(s.payload)?.resource;if(D&&typeof D=="object"&&"provenance"in D){let N=D.provenance;N&&k.set(A,{...N})}l(),Y();return}if(s.type===Ae){let C=kt(s.payload);v(A,is(C?.failure))}}},override(s,A){E();let C=y.get(s);if(!C)throw new Error(`createVisualLayerController: unknown layer "${s}"`);if(A===null){C.overrideVersion=null,Y();return}if(!me(C.declaration,A))throw new Error(`createVisualLayerController: unknown version "${A}" on "${s}"`);if(C.overrideVersion=A,c(C,A)){C.transition&&o.cancel(C.transition.cueKey),f(C,A,!0);return}Y()},play:T,step(s=1){E();let A=o.step(s);return w(A),l(),Y(),P()},snapshot(){return E(),K()},restore:$,inspect(){return E(),Y(),[...y.values()].map(q).sort((s,A)=>s.id<A.id?-1:s.id>A.id?1:0)},captureComposedFrame(){return E(),Y(),t.captureComposedFrame()},destroy(){d||(d=!0,o.reset(),F.length=0,x.length=0)},get frame(){return o.frame},get sceneId(){return a},get compositor(){return t}}}async function Xa(e,t){let n=e.captureComposedFrame();if(!t)return n;let{writeFile:r}=await import("node:fs/promises");return await r(t,rt(n.pngDataUrl)),{...n,path:t}}export{fr as DEFAULT_HEADLESS_HEIGHT,pr as DEFAULT_HEADLESS_WIDTH,lr as HEADLESS_PNG_DATA_URL,ne as HeadlessUnsupportedOperationError,hr as UPDATE_GOLDEN_ENV,br as assertPixelsEqual,eo as assertPngDataUrlsEqual,Lt as attachHeadlessCanvas2D,ts as captureVisualLayers,yr as compareImageData,To as compareReplayTraces,bn as createDefaultGlyphAtlas,Uo as createHeadlessAudioAdapter,Zi as createHeadlessHarness,Co as createHeadlessMultiCartHarness,_r as createImageFixture,Tr as createReplayInspector,os as createVisualLayerController,Vt as decodePng,Pe as encodePng,De as encodePngDataUrl,Nr as getHeadlessSurface,tn as imageDataFromPngDataUrl,St as installHeadlessCanvas,Se as makeImageData,Do as replayExportedTrace,Mt as setDefaultGlyphAtlas,gr as shouldUpdateGolden,Xa as writeComposedFrame,no as writeVisualArtifacts};
|
|
8
|
+
var Vr=Object.defineProperty;var pn=(e,t)=>()=>(e&&(t=e(e=0)),t);var Hr=(e,t)=>{for(var n in t)Vr(e,n,{get:t[n],enumerable:!0})};var si={};function ai(e,t){let n=e.indexOf(Hn);if(n===-1)return null;let r=n+Hn.length,o=`const __cyberSkip=new Set(${JSON.stringify(t)});const __cyberOrig=registerProcessor;registerProcessor=(n,p)=>__cyberSkip.has(n)?undefined:__cyberOrig(n,p);`;return e.slice(0,r)+o+e.slice(r)}var Bt,lt,oi,ze,Hn,On=pn(()=>{"use strict";Bt=/AudioWorkletProcessor with name:\s*["'`][^"'`]+["'`]\s+is already registered/i,lt="__cyberartWorkletPatchApplied";typeof window<"u"&&!window[lt]&&(window.addEventListener("error",e=>{let t=e?.message??"";Bt.test(t)&&(e.preventDefault(),e.stopImmediatePropagation())},!0),window.addEventListener("unhandledrejection",e=>{let t=e?.reason,n=typeof t=="string"?t:t?.message??"";Bt.test(n)&&e.preventDefault()}),window[lt]=!0);oi=!1,ze=(...e)=>{oi&&console.log("[workletPatch]",...e)},Hn="((AudioWorkletProcessor,registerProcessor)=>{";if(typeof AudioWorklet<"u"&&!AudioWorklet.prototype[lt]){let e=new WeakMap,t=/registerProcessor\s*\(\s*['"`]([^'"`]+)['"`]/g,n=AudioWorklet.prototype.addModule,r=0;AudioWorklet.prototype.addModule=async function(o,d){let u=++r,m=e.get(this);m||(m=new Set,e.set(this,m)),ze(`#${u} addModule`,{url:o.slice(0,64),isBlob:o.startsWith("blob:"),knownBefore:[...m]});let g=o,b=null;if(o.startsWith("blob:")){let h=null;try{h=await(await fetch(o)).text()}catch(A){ze(`#${u} blob fetch failed`,A)}if(h!==null){let A=new Set;for(let F of h.matchAll(t))A.add(F[1]);if(A.size>0){let F=[...A].filter(S=>m.has(S)),R=[...A].filter(S=>!m.has(S));if(F.length>0&&R.length===0){ze(`#${u} short-circuit \u2014 all processors already registered`,F);return}if(F.length>0&&R.length>0){let S=ai(h,F);if(S!==null){let L=new Blob([S],{type:"application/javascript"});b=URL.createObjectURL(L),g=b,ze(`#${u} rewrote blob; skipping`,F,"allowing",R)}else ze(`#${u} blob rewrite failed; passing original through`)}R.forEach(S=>m.add(S))}}}return n.call(this,g,d).then(()=>{b&&URL.revokeObjectURL(b)},h=>{b&&URL.revokeObjectURL(b);let A=(h&&h.message)??"";if(!(Bt.test(A)||/already registered/i.test(A)))throw h})},AudioWorklet.prototype[lt]=!0}});var Nn={};Hr(Nn,{AUDIO_LIBRARIES:()=>$t,adaptersFor:()=>ft,importTone:()=>pt,normalizeAudioLibraries:()=>mt});async function pt(){let e=await import("tone");if(typeof e.start=="function")return e;let t=e.default;return t&&typeof t.start=="function"?t:e}function mt(e){if(!e)return[];let t=Array.isArray(e)?e:[e],n=[];for(let r of t){if(!(r in $t)){console.warn(`Unknown audio library "${r}"`);continue}let i=r;n.includes(i)||n.push(i)}return n}function ft(e){return e.map(t=>$t[t])}var _n,$t,Gt=pn(()=>{"use strict";_n={id:"tone",async load(){await Promise.resolve().then(()=>(On(),si))},async unlock(){await _n.load(),await(await pt()).start()},async resumeIfSuspended(){let e=await pt();e.context.state==="suspended"&&await e.context.resume()},async suspendIfRunning(){let t=(await pt()).context.rawContext;"suspend"in t&&t.state==="running"&&await t.suspend()}},$t={tone:_n}});var ne=class extends Error{constructor(n,r){super(r?`Headless Canvas2D does not support ${n}: ${r}`:`Headless Canvas2D does not support ${n}`);this.name="HeadlessUnsupportedOperationError";this.operation=n}},ke=class{constructor(t,n,r,i,o,d=0,u=0){this.stops=[];this.kind=t,this.x0=n,this.y0=r,this.x1=i,this.y1=o,this.r0=d,this.r1=u}addColorStop(t,n){if(!Number.isFinite(t)||t<0||t>1)throw new ne("addColorStop","offset must be in [0, 1]");this.stops.push({offset:t,color:it(n)}),this.stops.sort((r,i)=>r.offset-i.offset)}colorAt(t){let n=t<0?0:t>1?1:t;if(this.stops.length===0)return{r:0,g:0,b:0,a:0};if(this.stops.length===1||n<=this.stops[0].offset)return this.stops[0].color;let r=this.stops[this.stops.length-1];if(n>=r.offset)return r.color;for(let i=1;i<this.stops.length;i++){let o=this.stops[i],d=this.stops[i-1];if(n<=o.offset){let u=o.offset-d.offset,m=u===0?0:(n-d.offset)/u;return $r(d.color,o.color,m)}}return r.color}},Tt={a:1,b:0,c:0,d:1,e:0,f:0},Or={black:"#000000",white:"#ffffff",red:"#ff0000",green:"#008000",blue:"#0000ff",cyan:"#00ffff",magenta:"#ff00ff",yellow:"#ffff00",gold:"#ffd700",orange:"#ffa500",navy:"#000080",gray:"#808080",grey:"#808080",transparent:"#00000000"},Te=new WeakMap,yn,mn=!1,Lt=class{constructor(t,n,r,i){this.context=null;this.onDeviceReset=null;this.canvas=t,this.width=Math.max(0,n|0),this.height=Math.max(0,r|0),this.alpha=i.alpha!==!1,this.pixels=new Uint8ClampedArray(this.width*this.height*4),this.glyphAtlas=i.glyphAtlas??yn??An(),this.alpha||this.fillOpaqueBlack()}resize(t,n,r=!1){let i=Math.max(0,t|0),o=Math.max(0,n|0);i!==this.width||o!==this.height?(this.width=i,this.height=o,this.pixels=new Uint8ClampedArray(i*o*4)):r&&this.pixels.fill(0),this.alpha||this.fillOpaqueBlack()}fillOpaqueBlack(){let t=this.pixels;for(let n=3;n<t.length;n+=4)t[n]=255}};function _r(e,t,n){let r=n??new Uint8ClampedArray(e*t*4);if(r.length!==e*t*4)throw new ne("createImageFixture","data length must be width*height*4");return{__headlessImage:!0,width:e,height:t,data:r}}function Vt(e){yn=e}function Nr(e){return Te.get(e)}function Ht(e,t={}){let n=Te.get(e);if(n?.context)return n.context;let r=Math.max(0,Number(e.width)||0),i=Math.max(0,Number(e.height)||0),o=new Lt(e,r,i,t);Te.set(e,o);let d=Kr(o);return o.context=d,d}function bn(e){let t=Te.get(e);if(t)return t.resize(e.width,e.height,!1),De(t.width,t.height,t.pixels)}function Kr(e){let t={...Tt},n=[],r="#000000",i="#000000",o={r:0,g:0,b:0,a:255},d={r:0,g:0,b:0,a:255},u=1,m="source-over",g=1,b="butt",h="10px sans-serif",A="start",F="alphabetic",R=null,S=!0,L=[],_=null,K=(l,y)=>{_={points:[s(l,y)],closed:!1},L.push(_)},w=(l,y)=>{if(!_){K(l,y);return}_.points.push(s(l,y))},v=()=>{if(!_||_.points.length===0)return;_.closed=!0;let l=_.points[0];_.points.push({x:l.x,y:l.y})},s=(l,y)=>({x:t.a*l+t.c*y+t.e,y:t.b*l+t.d*y+t.f}),c=()=>{if(m!=="source-over"&&m!=="copy")throw new ne("globalCompositeOperation",m)},I=()=>{e.resize(e.canvas.width,e.canvas.height,!1)},j=()=>{t={...Tt},n.length=0,L.length=0,_=null,R=null,r="#000000",i="#000000",o={r:0,g:0,b:0,a:255},d={r:0,g:0,b:0,a:255},u=1,m="source-over",g=1,b="butt",h="10px sans-serif",A="start",F="alphabetic",S=!0};e.onDeviceReset=j;let Y=(l,y,k,T=m)=>{if(l<0||y<0||l>=e.width||y>=e.height||R&&R[y*e.width+l]===0)return;let P=(y*e.width+l)*4,H=e.pixels;if(T==="copy"){H[P]=k.r,H[P+1]=k.g,H[P+2]=k.b,H[P+3]=e.alpha?k.a:255;return}let U=Math.round(k.a/255*u*255);if(U<=0)return;if(U>=255){H[P]=k.r,H[P+1]=k.g,H[P+2]=k.b,H[P+3]=255;return}let B=U/255,a=H[P+3]/255,C=B+a*(1-B);if(C<=0){H[P]=0,H[P+1]=0,H[P+2]=0,H[P+3]=e.alpha?0:255;return}H[P]=Math.round((k.r*B+H[P]*a*(1-B))/C),H[P+1]=Math.round((k.g*B+H[P+1]*a*(1-B))/C),H[P+2]=Math.round((k.b*B+H[P+2]*a*(1-B))/C),H[P+3]=e.alpha?Math.round(C*255):255},q=(l,y,k,T)=>{if(!(l instanceof ke))return y;let P=rt(t,k+.5,T+.5);return Br(l,P.x,P.y)},J=(l,y,k,T,P)=>{c(),I();let H=Dt(l,e.width,e.height);if(H)for(let U=H.minY;U<=H.maxY;U++)for(let B=H.minX;B<=H.maxX;B++){let a=B+.5,C=U+.5;fn(l,a,C,T)&&Y(B,U,q(y,k,B,U),P)}},z=l=>{c(),I();let y=Math.sqrt(Math.abs(t.a*t.d-t.b*t.c)),k=g*(y===0?1:y)/2,T=Dt(l,e.width,e.height,k+1);if(T)for(let P=T.minY;P<=T.maxY;P++)for(let H=T.minX;H<=T.maxX;H++)jr(l,H+.5,P+.5,k,b)&&Y(H,P,q(i,d,H,P))},p=(l,y)=>{if(l instanceof ke){y==="fillStyle"?(r=l,o={r:0,g:0,b:0,a:255}):(i=l,d={r:0,g:0,b:0,a:255});return}if(typeof l!="string")throw new ne(y,String(l));let k=it(l);y==="fillStyle"?(r=l,o=k):(i=l,d=k)},D={get canvas(){return e.canvas},get fillStyle(){return r},set fillStyle(l){p(l,"fillStyle")},get strokeStyle(){return i},set strokeStyle(l){p(l,"strokeStyle")},get globalAlpha(){return u},set globalAlpha(l){u=vn(l)},get globalCompositeOperation(){return m},set globalCompositeOperation(l){if(l!=="source-over"&&l!=="copy")throw new ne("globalCompositeOperation",l);m=l},get lineWidth(){return g},set lineWidth(l){g=Number.isFinite(l)&&l>0?l:1},get lineCap(){return b},set lineCap(l){if(l!=="butt"&&l!=="round"&&l!=="square")throw new ne("lineCap",String(l));b=l},get font(){return h},set font(l){h=l},get textAlign(){return A},set textAlign(l){if(l!=="start"&&l!=="left"&&l!=="center"&&l!=="right"&&l!=="end")throw new ne("textAlign",String(l));A=l},get textBaseline(){return F},set textBaseline(l){F=l},get imageSmoothingEnabled(){return S},set imageSmoothingEnabled(l){S=!!l},imageSmoothingQuality:"low",lineJoin:"miter",miterLimit:10,lineDashOffset:0,shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0)",shadowOffsetX:0,shadowOffsetY:0,setGlyphAtlas(l){e.glyphAtlas=l},save(){n.push({transform:{...t},fillStyle:r,strokeStyle:i,fillStyleRaw:r,strokeStyleRaw:i,globalAlpha:u,globalCompositeOperation:m,lineWidth:g,lineCap:b,font:h,textAlign:A,textBaseline:F,clip:R?R.slice():null,imageSmoothingEnabled:S})},restore(){let l=n.pop();l&&(t=l.transform,r=l.fillStyleRaw,i=l.strokeStyleRaw,r instanceof ke?o={r:0,g:0,b:0,a:255}:o=it(r),i instanceof ke?d={r:0,g:0,b:0,a:255}:d=it(i),u=l.globalAlpha,m=l.globalCompositeOperation,g=l.lineWidth,b=l.lineCap,h=l.font,A=l.textAlign,F=l.textBaseline,R=l.clip,S=l.imageSmoothingEnabled)},beginPath(){L.length=0,_=null},closePath:v,moveTo:K,lineTo:w,rect(l,y,k,T){K(l,y),w(l+k,y),w(l+k,y+T),w(l,y+T),v()},quadraticCurveTo(l,y,k,T){let P=_?.points[_.points.length-1];if(!P){K(k,T);return}let H=rt(t,P.x,P.y);zr(H.x,H.y,l,y,k,T,16,(U,B)=>{_.points.push(s(U,B))})},bezierCurveTo(l,y,k,T,P,H){let U=_?.points[_.points.length-1];if(!U){K(P,H);return}let B=rt(t,U.x,U.y);qr(B.x,B.y,l,y,k,T,P,H,24,(a,C)=>{_.points.push(s(a,C))})},arc(l,y,k,T,P,H=!1){if(k<0)throw new ne("arc","negative radius");let U=hn(l,y,k,T,P,H);if(U.length===0)return;let B=U[0];_?_.points.push(s(B.x,B.y)):K(B.x,B.y);for(let a=1;a<U.length;a++)_.points.push(s(U[a].x,U[a].y))},ellipse(l,y,k,T,P,H,U,B=!1){if(k<0||T<0)throw new ne("ellipse","negative radius");let a=hn(0,0,1,H,U,B),C=Math.cos(P),E=Math.sin(P);for(let M=0;M<a.length;M++){let N=a[M].x*k,Q=a[M].y*T,Z=l+N*C-Q*E,W=y+N*E+Q*C;M===0&&!_?K(Z,W):w(Z,W)}},fill(l="nonzero"){J(Pt(L),r,o,l)},stroke(){z(Pt(L))},clip(l="nonzero"){let y=new Uint8Array(e.width*e.height),k=Pt(L),T=Dt(k,e.width,e.height);if(T)for(let P=T.minY;P<=T.maxY;P++)for(let H=T.minX;H<=T.maxX;H++)fn(k,H+.5,P+.5,l)&&(y[P*e.width+H]=1);if(!R){R=y;return}for(let P=0;P<R.length;P++)R[P]=R[P]&&y[P]?1:0},fillRect(l,y,k,T){J(V(l,y,k,T),r,o,"nonzero")},strokeRect(l,y,k,T){z(V(l,y,k,T))},clearRect(l,y,k,T){let P=e.alpha?{r:0,g:0,b:0,a:0}:{r:0,g:0,b:0,a:255};J(V(l,y,k,T),"#000000",P,"nonzero","copy")},fillText(l,y,k){X(String(l),y,k,r,o,!0)},strokeText(l,y,k){X(String(l),y,k,i,d,!1)},measureText(l){return{width:gn(String(l),h,e.glyphAtlas)}},translate(l,y){t=nt(t,{a:1,b:0,c:0,d:1,e:l,f:y})},rotate(l){let y=Math.cos(l),k=Math.sin(l);t=nt(t,{a:y,b:k,c:-k,d:y,e:0,f:0})},scale(l,y){t=nt(t,{a:l,b:0,c:0,d:y,e:0,f:0})},transform(l,y,k,T,P,H){t=nt(t,{a:l,b:y,c:k,d:T,e:P,f:H})},setTransform(l,y,k,T,P,H){if(l&&typeof l=="object"){t={a:l.a,b:l.b,c:l.c,d:l.d,e:l.e,f:l.f};return}t={a:Number(l)||0,b:Number(y)||0,c:Number(k)||0,d:Number(T)||0,e:Number(P)||0,f:Number(H)||0}},resetTransform(){t={...Tt}},getTransform(){return{...t}},createLinearGradient(l,y,k,T){return new ke("linear",l,y,k,T)},createRadialGradient(l,y,k,T,P,H){if(k<0||H<0)throw new ne("createRadialGradient","negative radius");return new ke("radial",l,y,T,P,k,H)},createImageData(l,y){return typeof l=="object"?Se(new Uint8ClampedArray(l.width*l.height*4),l.width,l.height):Se(new Uint8ClampedArray(l*(y??0)*4),l,y??0)},getImageData(l,y,k,T){I();let P=l|0,H=y|0,U=k|0,B=T|0,a=new Uint8ClampedArray(U*B*4);for(let C=0;C<B;C++)for(let E=0;E<U;E++){let M=P+E,N=H+C,Q=(C*U+E)*4;if(M<0||N<0||M>=e.width||N>=e.height)continue;let Z=(N*e.width+M)*4;a[Q]=e.pixels[Z],a[Q+1]=e.pixels[Z+1],a[Q+2]=e.pixels[Z+2],a[Q+3]=e.pixels[Z+3]}return Se(a,U,B)},putImageData(l,y,k){I();let T=y|0,P=k|0,H=l.data;for(let U=0;U<l.height;U++)for(let B=0;B<l.width;B++){let a=T+B,C=P+U;if(a<0||C<0||a>=e.width||C>=e.height)continue;let E=(U*l.width+B)*4,M=(C*e.width+a)*4;e.pixels[M]=H[E],e.pixels[M+1]=H[E+1],e.pixels[M+2]=H[E+2],e.pixels[M+3]=e.alpha?H[E+3]:255}},drawImage(l,...y){let k=Ur(l),T=0,P=0,H=k.width,U=k.height,B,a,C,E;if(y.length===2)B=y[0],a=y[1],C=H,E=U;else if(y.length===4)B=y[0],a=y[1],C=y[2],E=y[3];else if(y.length===8)T=y[0],P=y[1],H=y[2],U=y[3],B=y[4],a=y[5],C=y[6],E=y[7];else throw new ne("drawImage","invalid argument count");c(),I();let M=[s(B,a),s(B+C,a),s(B+C,a+E),s(B,a+E)],N=Math.max(0,Math.floor(Math.min(...M.map(te=>te.x)))),Q=Math.min(e.width-1,Math.ceil(Math.max(...M.map(te=>te.x)))),Z=Math.max(0,Math.floor(Math.min(...M.map(te=>te.y)))),W=Math.min(e.height-1,Math.ceil(Math.max(...M.map(te=>te.y))));for(let te=Z;te<=W;te++)for(let ie=N;ie<=Q;ie++){let ve=rt(t,ie+.5,te+.5),xe=(ve.x-B)/C,Ee=(ve.y-a)/E;if(xe<0||Ee<0||xe>=1||Ee>=1)continue;let f=Math.floor(T+xe*H),x=Math.floor(P+Ee*U);if(f<0||x<0||f>=k.width||x>=k.height)continue;let O=(x*k.width+f)*4;Y(ie,te,{r:k.data[O],g:k.data[O+1],b:k.data[O+2],a:k.data[O+3]})}},setLineDash(l){if(l.length>0)throw new ne("setLineDash","non-empty dash")},getLineDash(){return[]},createPattern(){throw new ne("createPattern")}};function V(l,y,k,T){let P=s(l,y),H=s(l+k,y),U=s(l+k,y+T),B=s(l,y+T);return[{closed:!0,points:[P,H,U,B,P]}]}function X(l,y,k,T,P,H){c();let U=e.glyphAtlas,B=Sn(h),a=B/U.cellHeight,C=gn(l,h,U),E=y;A==="center"?E=y-C/2:(A==="right"||A==="end")&&(E=y-C);let M=k;F==="top"||F==="hanging"?M=k:F==="middle"?M=k-B/2:M=k-B;let N=E,Q=(U.cellWidth+1)*a;for(let Z of l){let W=U.glyphs[Z]??U.glyphs[Z.toUpperCase()];if(!W){N+=Q;continue}for(let te=0;te<U.cellHeight;te++)for(let ie=0;ie<U.cellWidth;ie++){if(W[te*U.cellWidth+ie]===0)continue;if(!H){let ae=ie===0||W[te*U.cellWidth+ie-1]===0,he=ie===U.cellWidth-1||W[te*U.cellWidth+ie+1]===0,we=te===0||W[(te-1)*U.cellWidth+ie]===0,tt=te===U.cellHeight-1||W[(te+1)*U.cellWidth+ie]===0;if(!ae&&!he&&!we&&!tt)continue}let ve=N+ie*a,xe=M+te*a,Ee=N+(ie+1)*a,f=M+(te+1)*a,x=s(ve,xe),O=s(Ee,f),$=Math.max(0,Math.floor(Math.min(x.x,O.x))),G=Math.min(e.width-1,Math.ceil(Math.max(x.x,O.x))-1),ee=Math.max(0,Math.floor(Math.min(x.y,O.y))),le=Math.min(e.height-1,Math.ceil(Math.max(x.y,O.y))-1);for(let ae=ee;ae<=le;ae++)for(let he=$;he<=G;he++)Y(he,ae,q(T,P,he,ae))}N+=Q}}return new Proxy(D,{get(l,y,k){if(Reflect.has(l,y))return Reflect.get(l,y,k);if(typeof y=="symbol")return;let T=String(y);if(!(T==="then"||T==="toJSON"))return(...P)=>{throw new ne(T)}},set(l,y,k,T){if(y==="shadowBlur"&&k)throw new ne("shadowBlur");if((y==="shadowOffsetX"||y==="shadowOffsetY")&&k)throw new ne(String(y));if(y==="filter"&&k&&k!=="none")throw new ne("filter",String(k));if(Reflect.has(l,y))return Reflect.set(l,y,k,T);throw new ne(String(y))}})}function Ur(e){if(e&&typeof e=="object"&&"__headlessImage"in e){let t=e;return{width:t.width,height:t.height,data:t.data}}if(e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e){let t=e;if(t.data instanceof Uint8ClampedArray)return{width:t.width,height:t.height,data:t.data}}if(typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement){let t=Te.get(e);if(!t)throw new ne("drawImage","source canvas has no headless surface");return{width:t.width,height:t.height,data:t.pixels}}throw new ne("drawImage","source must be ImageData, a headless canvas, or createImageFixture()")}function Br(e,t,n){if(e.kind==="linear"){let d=e.x1-e.x0,u=e.y1-e.y0,m=d*d+u*u,g=m===0?0:((t-e.x0)*d+(n-e.y0)*u)/m;return e.colorAt(g)}let r=Math.hypot(t-e.x1,n-e.y1),i=e.r1-e.r0,o=i===0?0:(r-e.r0)/i;return e.colorAt(o)}function $r(e,t,n){return{r:Math.round(e.r+(t.r-e.r)*n),g:Math.round(e.g+(t.g-e.g)*n),b:Math.round(e.b+(t.b-e.b)*n),a:Math.round(e.a+(t.a-e.a)*n)}}function nt(e,t){return{a:e.a*t.a+e.c*t.b,b:e.b*t.a+e.d*t.b,c:e.a*t.c+e.c*t.d,d:e.b*t.c+e.d*t.d,e:e.a*t.e+e.c*t.f+e.e,f:e.b*t.e+e.d*t.f+e.f}}function rt(e,t,n){let r=e.a*e.d-e.b*e.c;if(r===0)return{x:t,y:n};let i=e.d/r,o=-e.b/r,d=-e.c/r,u=e.a/r,m=(e.c*e.f-e.d*e.e)/r,g=(e.b*e.e-e.a*e.f)/r;return{x:i*t+d*n+m,y:o*t+u*n+g}}function Pt(e){return e.map(t=>({closed:t.closed,points:t.points.map(n=>({x:n.x,y:n.y}))}))}function Dt(e,t,n,r=0){let i=1/0,o=1/0,d=-1/0,u=-1/0;for(let m of e)for(let g of m.points)i=Math.min(i,g.x),o=Math.min(o,g.y),d=Math.max(d,g.x),u=Math.max(u,g.y);return Number.isFinite(i)?{minX:Math.max(0,Math.floor(i-r)),minY:Math.max(0,Math.floor(o-r)),maxX:Math.min(t-1,Math.ceil(d+r)),maxY:Math.min(n-1,Math.ceil(u+r))}:null}function fn(e,t,n,r){let i=0,o=0;for(let d of e){let u=d.points;if(!(u.length<2))for(let m=1;m<u.length;m++){let g=u[m-1],b=u[m],h=Gr(g.x,g.y,b.x,b.y,t,n);i+=h,h!==0&&(o+=1)}}return r==="evenodd"?o%2===1:i!==0}function Gr(e,t,n,r,i,o){if(t<=o==r<=o)return 0;let d=e+(o-t)/(r-t)*(n-e);return i<d?r>t?1:-1:0}function jr(e,t,n,r,i){for(let o of e){let d=o.points;for(let u=1;u<d.length;u++){let m=d[u-1],g=d[u];if(i==="round"){if(Wr(t,n,m.x,m.y,g.x,g.y)<=r)return!0;continue}let b=g.x-m.x,h=g.y-m.y,A=Math.hypot(b,h);if(A===0){if(Math.hypot(t-m.x,n-m.y)<=r)return!0;continue}let F=b/A,R=h/A,S=m.x,L=m.y,_=g.x,K=g.y;i==="square"&&(S-=F*r,L-=R*r,_+=F*r,K+=R*r);let w=_-S,v=K-L,s=w*w+v*v,c=((t-S)*w+(n-L)*v)/s;if(c<0||c>1)continue;let I=S+c*w,j=L+c*v;if(Math.hypot(t-I,n-j)<=r)return!0}}return!1}function Wr(e,t,n,r,i,o){let d=i-n,u=o-r,m=d*d+u*u;if(m===0)return Math.hypot(e-n,t-r);let g=((e-n)*d+(t-r)*u)/m;return g=g<0?0:g>1?1:g,Math.hypot(e-(n+g*d),t-(r+g*u))}function zr(e,t,n,r,i,o,d,u){for(let m=1;m<=d;m++){let g=m/d,b=1-g;u(b*b*e+2*b*g*n+g*g*i,b*b*t+2*b*g*r+g*g*o)}}function qr(e,t,n,r,i,o,d,u,m,g){for(let b=1;b<=m;b++){let h=b/m,A=1-h,F=A*A,R=h*h;g(F*A*e+3*F*h*n+3*A*R*i+R*h*d,F*A*t+3*F*h*r+3*A*R*o+R*h*u)}}function hn(e,t,n,r,i,o){let d=r,u=i;!o&&u<d&&(u+=Math.PI*2),o&&d<u&&(d+=Math.PI*2);let m=u-d,g=Math.max(8,Math.min(360,Math.ceil(Math.abs(m)*Math.max(n,1)))),b=[];for(let h=0;h<=g;h++){let A=d+m*h/g;b.push({x:e+Math.cos(A)*n,y:t+Math.sin(A)*n})}return b}function vn(e){return Number.isFinite(e)?e<0?0:e>1?1:e:1}function it(e){let t=e.trim().toLowerCase(),r=Or[t]??t;if(r==="transparent")return{r:0,g:0,b:0,a:0};if(r[0]==="#"){let o=r.slice(1);if(o.length===3)return{r:parseInt(o[0]+o[0],16),g:parseInt(o[1]+o[1],16),b:parseInt(o[2]+o[2],16),a:255};if(o.length===6)return{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16),a:255};if(o.length===8)return{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16),a:parseInt(o.slice(6,8),16)}}let i=r.match(/^rgba?\(\s*([0-9.]+)\s*,\s*([0-9.]+)\s*,\s*([0-9.]+)(?:\s*,\s*([0-9.]+))?\s*\)$/);if(i)return{r:Mt(Number(i[1])),g:Mt(Number(i[2])),b:Mt(Number(i[3])),a:i[4]===void 0?255:Math.round(vn(Number(i[4]))*255)};throw new ne("fillStyle",e)}function Mt(e){return Number.isFinite(e)?e<0?0:e>255?255:Math.round(e):0}function Sn(e){let t=e.match(/([0-9]+(?:\.[0-9]+)?)px/);return t?Number(t[1]):10}function gn(e,t,n){let r=Sn(t)/n.cellHeight;return e.length*(n.cellWidth+1)*r}function Se(e,t,n){if(typeof ImageData=="function")try{return new ImageData(e,t,n)}catch{try{let r=new ImageData(t,n);return r.data.set(e),r}catch{}}return{data:e,width:t,height:n,colorSpace:"srgb"}}function An(){let n={" ":new Uint8Array(35)},r={0:[14,17,19,21,25,17,14],1:[4,12,4,4,4,4,14],2:[14,17,1,2,4,8,31],3:[14,17,1,6,1,17,14],4:[2,6,10,18,31,2,2],5:[31,16,30,1,1,17,14],6:[14,16,30,17,17,17,14],7:[31,1,2,4,8,8,8],8:[14,17,17,14,17,17,14],9:[14,17,17,15,1,1,14],A:[14,17,17,31,17,17,17],B:[30,17,17,30,17,17,30],C:[14,17,16,16,16,17,14],D:[30,17,17,17,17,17,30],E:[31,16,16,30,16,16,31],F:[31,16,16,30,16,16,16],G:[14,17,16,23,17,17,14],H:[17,17,17,31,17,17,17],I:[14,4,4,4,4,4,14],K:[17,18,20,24,20,18,17],L:[16,16,16,16,16,16,31],M:[17,27,21,21,17,17,17],N:[17,25,21,19,17,17,17],O:[14,17,17,17,17,17,14],P:[30,17,17,30,16,16,16],R:[30,17,17,30,20,18,17],S:[15,16,16,14,1,1,30],T:[31,4,4,4,4,4,4],U:[17,17,17,17,17,17,14],V:[17,17,17,17,17,10,4],W:[17,17,17,21,21,21,10],Y:[17,17,10,4,4,4,4],Z:[31,1,2,4,8,16,31],".":[0,0,0,0,0,0,4],"-":[0,0,0,31,0,0,0],"+":[0,4,4,31,4,4,0],"*":[0,21,14,31,14,21,0],"!":[4,4,4,4,4,0,4],"?":[14,17,1,2,4,0,4],"/":[1,2,2,4,8,8,16],":":[0,4,0,0,0,4,0],"\u2713":[1,1,2,2,20,8,0]};for(let[i,o]of Object.entries(r)){let d=new Uint8Array(35);for(let u=0;u<7;u++)for(let m=0;m<5;m++)d[u*5+m]=o[u]&1<<4-m?1:0;n[i]=d,n[i.toLowerCase()]=d}return{cellWidth:5,cellHeight:7,glyphs:n}}var Cn=new Uint32Array(256);for(let e=0;e<256;e++){let t=e;for(let n=0;n<8;n++)t=t&1?3988292384^t>>>1:t>>>1;Cn[e]=t>>>0}function Yr(e){let t=4294967295;for(let n=0;n<e.length;n++)t=Cn[(t^e[n])&255]^t>>>8;return(t^4294967295)>>>0}function Jr(e){let t=1,n=0;for(let r=0;r<e.length;r++)t=(t+e[r])%65521,n=(n+t)%65521;return(n<<16|t)>>>0}function Ge(e){return new Uint8Array([e>>>24&255,e>>>16&255,e>>>8&255,e&255])}function Ft(e,t){let n=new Uint8Array(8+t.length+4);n.set(Ge(t.length),0),n[4]=e.charCodeAt(0),n[5]=e.charCodeAt(1),n[6]=e.charCodeAt(2),n[7]=e.charCodeAt(3),n.set(t,8);let r=n.subarray(4,8+t.length);return n.set(Ge(Yr(r)),8+t.length),n}function Xr(e){let t=[];for(let d=0;d<e.length;d+=65535){let u=e.subarray(d,Math.min(d+65535,e.length)),m=d+65535>=e.length,g=new Uint8Array(5+u.length);g[0]=m?1:0,g[1]=u.length&255,g[2]=u.length>>>8&255;let b=~u.length&65535;g[3]=b&255,g[4]=b>>>8&255,g.set(u,5),t.push(g)}t.length===0&&t.push(new Uint8Array([1,0,0,255,255]));let r=t.reduce((d,u)=>d+u.length,0),i=new Uint8Array(2+r+4);i[0]=120,i[1]=1;let o=2;for(let d of t)i.set(d,o),o+=d.length;return i.set(Ge(Jr(e)),o),i}function Pe(e,t,n){let r=e*4,i=new Uint8Array(t*(1+r));for(let h=0;h<t;h++){let A=h*(1+r);i[A]=0,i.set(n.subarray(h*r,(h+1)*r),A+1)}let o=new Uint8Array(13);o.set(Ge(e),0),o.set(Ge(t),4),o[8]=8,o[9]=6;let d=new Uint8Array([137,80,78,71,13,10,26,10]),u=[Ft("IHDR",o),Ft("IDAT",Xr(i)),Ft("IEND",new Uint8Array(0))],m=d.length+u.reduce((h,A)=>h+A.length,0),g=new Uint8Array(m);g.set(d,0);let b=d.length;for(let h of u)g.set(h,b),b+=h.length;return g}function De(e,t,n){let r=Pe(e,t,n),i="";for(let o=0;o<r.length;o++)i+=String.fromCharCode(r[o]);return`data:image/png;base64,${globalThis.btoa(i)}`}function Ot(e){let t=[137,80,78,71,13,10,26,10];for(let g=0;g<8;g++)if(e[g]!==t[g])throw new ne("decodePng","invalid signature");let n=0,r=0,i=[],o=8;for(;o<e.length;){let g=e[o]<<24|e[o+1]<<16|e[o+2]<<8|e[o+3],b=String.fromCharCode(e[o+4],e[o+5],e[o+6],e[o+7]),h=e.subarray(o+8,o+8+g);if(b==="IHDR"){if(n=h[0]<<24|h[1]<<16|h[2]<<8|h[3],r=h[4]<<24|h[5]<<16|h[6]<<8|h[7],h[8]!==8||h[9]!==6)throw new ne("decodePng","only 8-bit RGBA is supported")}else if(b==="IDAT")for(let A=0;A<h.length;A++)i.push(h[A]);else if(b==="IEND")break;o+=12+g}let d=Qr(new Uint8Array(i)),u=n*4,m=new Uint8ClampedArray(n*r*4);for(let g=0;g<r;g++){let b=g*(1+u);if(d[b]!==0)throw new ne("decodePng",`unsupported scanline filter ${d[b]}`);m.set(d.subarray(b+1,b+1+u),g*u)}return Se(m,n,r)}function Qr(e){if(e.length<6)throw new ne("decodePng","truncated zlib");let t=[],n=2;for(;n<e.length-4;){let d=e[n]&1;if((e[n]>>>1&3)!==0)throw new ne("decodePng","only stored deflate blocks are supported");n+=1;let m=e[n]|e[n+1]<<8;if(n+=4,t.push(e.subarray(n,n+m)),n+=m,d)break}let r=t.reduce((d,u)=>d+u.length,0),i=new Uint8Array(r),o=0;for(let d of t)i.set(d,o),o+=d.length;return i}function ot(e){let t=e.indexOf(","),n=t>=0?e.slice(t+1):e,r=globalThis.atob(n),i=new Uint8Array(r.length);for(let o=0;o<r.length;o++)i[o]=r.charCodeAt(o);return i}function En(){if(!mn){mn=!0;for(let e of["width","height"]){let t=Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype,e);if(!t?.set||!t.get)continue;let n=t.set;Object.defineProperty(HTMLCanvasElement.prototype,e,{configurable:!0,enumerable:t.enumerable,get:t.get,set(r){n.call(this,r);let i=Te.get(this);i&&(i.resize(this.width,this.height,!0),i.onDeviceReset?.())}})}}}var wn=()=>{let e=["ms","moz","webkit","o"];for(let t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"]},me=window.devicePixelRatio||1,Me=/Headless/i.test(navigator.userAgent),pa=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)||/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform);function kn(){return Math.min(window.innerWidth,window.innerHeight)}var _t="data-cyberart-canvas",Fe=class{constructor(t,n,r=1,i={}){this.width=t,this.height=n;let o=i.container,d=i.adoptFromDocument??!o,u=o?o.querySelector(`canvas[${_t}]`)??o.querySelector("canvas"):null;if(u)this.canvas=u,this.adopted=!0;else if(d){let m=document.getElementById("canvas")??document.querySelector("canvas");m?(this.canvas=m,this.adopted=!0):(this.canvas=document.createElement("canvas"),this.canvas.setAttribute("id","canvas"),this.adopted=!1)}else this.canvas=document.createElement("canvas"),this.adopted=!1;this.canvas.hasAttribute(_t)||this.canvas.setAttribute(_t,""),this.canvas.style.display="block",this.canvas.style.margin="auto",this.ctx=this.canvas.getContext("2d",{colorSpace:"display-p3",alpha:!1}),this.ctx.globalAlpha=r,this.ctx.imageSmoothingEnabled=!1,this.setSize(t,n)}setSize(t,n){this.width=t,this.height=n,this.canvas.width=t,this.canvas.height=n,this.canvas.style.width=`${t/me}px`,this.canvas.style.height=`${n/me}px`,this.imageData=this.ctx.createImageData(t,n),this.ctx.putImageData(this.imageData,0,0)}_blank(t=1){let n=t?Math.max(t,.03):1;this.ctx.fillStyle=`rgba(0,0,0,${n})`,this.ctx.fillRect(0,0,this.width,this.height)}clearAll(){this.ctx.save(),this.ctx.globalAlpha=1,this._blank(),this.ctx.restore()}};function at(e,t){let n=e/t,r,i;return n>1?(r=e,i=~~(e/n)):(i=t,r=~~(t*n)),{width:r,height:i,iWidth:1/r,iHeight:1/i,area:r*i,largeDim:Math.max(r,i),smallDim:Math.min(r,i),aspectRatio:n}}function Rn(e,t=window.innerWidth,n=window.innerHeight){let r=kn(),i,o;return n<t?e>1?t>=r*e?(i=r*e,o=r):(i=t,o=i/e):(i=r*e,o=r):e>1?(i=r,o=r/e):n<r/e?(o=n,i=o*e):(i=r,o=r/e),[i,o]}var Nt=class{constructor(t=!1,n=!0){this.debugMode=t,this.actionMap={},this.listening=n,this.checkKeypress=this.checkKeypress.bind(this),this.registerAction=this.registerAction.bind(this),this.listening&&window.addEventListener("keydown",this.checkKeypress,!1)}checkKeypress({key:t}){this.debugMode&&console.log(`Pressed ${t}`),t in this.actionMap&&this.actionMap[t]()}inject(t){this.checkKeypress({key:t})}registerAction(t,n,r=!1){if(t.length!==1)throw new Error(`Only single-character actions may be registered. Cannot register: ${t}`);if(t in this.actionMap&&!r)throw new Error(`Action already exists for code: ${t}`);this.actionMap[t]=n}destroy(){this.listening&&window.removeEventListener("keydown",this.checkKeypress,!1),this.actionMap={}}},st=Nt;var Kt=class{constructor(t,n={}){this.x=-1;this.y=-1;this.isDown=!1;this.clicks=[];this.canvas=t,this.listening=n.listen!==!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.listening&&(t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("pointermove",this.onPointerMove),t.addEventListener("pointerup",this.onPointerUp))}toCanvasCoords(t){let n=this.canvas.getBoundingClientRect();return{x:(t.clientX-n.left)*(this.canvas.width/n.width),y:(t.clientY-n.top)*(this.canvas.height/n.height)}}onPointerDown(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!0,this.clicks.push({x:n,y:r})}onPointerMove(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r}onPointerUp(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!1}hasClick(){return this.clicks.length>0}consumeClick(){return this.clicks.shift()??null}inject(t,n,r){this.x=n,this.y=r,t==="down"?(this.isDown=!0,this.clicks.push({x:n,y:r})):t==="up"&&(this.isDown=!1)}destroy(){this.listening&&(this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp))}},xn=Kt;function dt(){return{now:()=>performance.now()}}function In(e=0){let t=e;return{now:()=>t,set(n){t=n},advance(n){t+=n}}}var je=(e,t,n,r)=>({now:e,startTime:t,elapsedSinceStart:e-t,deltaSinceLastUpdate:n===null?0:e-n,deltaSinceLastRender:r===null?0:e-r}),ut=class{constructor(t,n,r,i,o,d={}){this.startTime=0;this.lastUpdateAt=null;this.lastRenderAt=null;this.clockOffsetMs=0;this.pauseStartedAt=null;this.renderAnimation=this.renderAnimation.bind(this),this.dimensionContext=at(t,n),this.R=r,this.gameManager=d.gameManager,this.hostChannel=d.hostChannel,this.clock=d.clock??dt(),this.kind=d.kind??"render",this.keyboardManager=new st(!1,d.captureKeyboard??!0),this.kind!=="calculation"&&(this.canvas=new Fe(this.dimensionContext.width,this.dimensionContext.height,1,d.canvasMount),this.drawingContext=this.canvas.ctx,this.pointerManager=new xn(this.canvas.canvas,{listen:d.listenToPointer!==!1})),this.animationCart=o;let u=d.customState;this.featureState=o.getDefaultFeatureState?.(this.R,this.dimensionContext,i,this.keyboardManager,u,this.pointerManager,this.gameManager,this.hostChannel),this.cartState=o.getDefaultState(this.R,this.dimensionContext,i,this.keyboardManager,u,this.pointerManager,this.gameManager,this.featureState,this.hostChannel),this.startTime=this.clock.now(),this.canvas?.clearAll()}captureFramebuffer(){let t=this.canvas?.imageData;if(!t)return new ImageData(this.dimensionContext.width,this.dimensionContext.height);let n=new ImageData(t.width,t.height);return n.data.set(t.data),n}restoreFramebuffer(t){let n=this.canvas?.imageData,r=this.drawingContext;return!n||!r||n.width!==t.width||n.height!==t.height||n.data.length!==t.data.length?!1:(n.data.set(t.data),r.putImageData(n,0,0),!0)}setPaused(t){let n=this.clock.now();if(t){this.pauseStartedAt===null&&(this.pauseStartedAt=n);return}this.pauseStartedAt!==null&&(this.clockOffsetMs+=n-this.pauseStartedAt,this.pauseStartedAt=null)}resolveNow(t){let n=this.pauseStartedAt!==null?t-this.pauseStartedAt:0;return t-this.clockOffsetMs-n}getElapsedSinceStart(t=this.clock.now()){return Math.max(0,this.resolveNow(t)-this.startTime)}restoreClock(t,n){this.pauseStartedAt=null,this.lastUpdateAt=null,this.lastRenderAt=null;let r=Math.max(0,t);if(typeof n=="number"&&Number.isFinite(n)){this.startTime=n,this.clockOffsetMs=this.clock.now()-n-r;return}this.clockOffsetMs=0,this.startTime=this.clock.now()-r}getRandomState(){return this.R.getState()}injectKey(t){this.keyboardManager.inject(t)}injectPointer(t,n,r){this.pointerManager?.inject(t,n,r)}async updateAnimationState(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=je(i,this.startTime,this.lastUpdateAt,this.lastRenderAt);this.cartState=this.animationCart.update(this.R,t,n,this.dimensionContext,this.cartState,this.keyboardManager,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastUpdateAt=i}async renderAnimation(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=je(i,this.startTime,this.lastUpdateAt,this.lastRenderAt),d=this.drawingContext,u=this.canvas?.imageData;this.kind!=="calculation"&&this.animationCart.render&&d&&u&&this.animationCart.render(this.R,t,n,this.dimensionContext,this.cartState,d,u,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastRenderAt=i}getCanvas(){return this.canvas?.canvas}getDrawDetails(){let t=this.canvas?.canvas;if(!t)throw new Error("calculation cart has no canvas");return[t,0,0,this.dimensionContext.width,this.dimensionContext.height]}teardown(){try{this.animationCart.teardown?.(this.cartState,this.featureState)}catch(t){console.error("Error during cart teardown",t)}this.keyboardManager.destroy(),this.pointerManager?.destroy()}};var ct=class extends Fe{constructor(t,n,r=1,i=!0,o={}){if(super(t,n,r,o),this.adopted)return;let d=o.container;if(d){this.canvas.parentNode!==d&&d.appendChild(this.canvas);return}if(i){let u=document.getElementById("canvas");u&&u!==this.canvas&&u.parentNode===document.body&&document.body.removeChild(u),document.body.appendChild(this.canvas)}}};function Tn(e){let t=parseInt(e.substring(0,8),16),n=parseInt(e.substring(8,8),16),r=parseInt(e.substring(16,8),16),i=parseInt(e.substring(24,8),16);return{next:()=>{t|=0,n|=0,r|=0,i|=0;let d=(t+n|0)+i|0;return i=i+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+d|0,(d>>>0)/4294967296},getRegs:()=>({a:t,b:n,c:r,d:i}),setRegs:d=>{t=d.a,n=d.b,r=d.c,i=d.d}}}var Le=class{constructor(t){this.seed=t.hash,this.useA=!1,this.genA=Tn(t.hash.substring(2,32)),this.genB=Tn(t.hash.substring(34,32)),this.prngA=this.genA.next,this.prngB=this.genB.next;for(let n=0;n<1e6;n+=2)this.prngA(),this.prngB()}getState(){let t=this.genA.getRegs(),n=this.genB.getRegs();return{seed:this.seed,useA:this.useA,prngA:{a:t.a,b:t.b,c:t.c,d:t.d},prngB:{a:n.a,b:n.b,c:n.c,d:n.d}}}setState(t){if(t.seed!==this.seed)throw new Error(`Random.setState: seed ${t.seed} does not match ${this.seed}`);this.useA=t.useA,this.genA.setRegs(t.prngA),this.genB.setRegs(t.prngB)}r_zero_one(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}dec(t,n){return t===void 0?this.r_zero_one():n===void 0?t*this.r_zero_one():t+(n-t)*this.r_zero_one()}int(t,n){return n===void 0&&(n=t,t=0),Math.floor(this.dec(t,n))}bool(t=.5){return this.r_zero_one()<t}sign(){return this.bool()?1:-1}choose(t){return t[this.int(t.length)]}};var Mn="bafybeicjwcq5lxxtfnyj4p2ugcr7ctyb5wl62cbcechj6tsabdq5whcs7u",Pn="https://ipfs.io/ipfs/";function Zr(e){return e.endsWith("/")?e:`${e}/`}var We=null;function ei(e){return[...Array(e)].map(()=>Math.floor(Math.random()*16).toString(16)).join("")}function ti(e){return e&&e.length>0?e:[{cid:Mn}]}function ni(e){return e.startsWith("0x")?e:`0x${e}`}var Fn=/^(0[xX])?[0-9a-fA-F]{64}$/;function ri(e){let t="",n=2166136261,r=522970236;for(let i=0;t.length<64;i++){for(let o=0;o<e.length;o++)n^=e.charCodeAt(o)+i,n=Math.imul(n,16777619),r^=e.charCodeAt(o)+i*17,r=Math.imul(r,16777619);t+=(n>>>0).toString(16).padStart(8,"0"),t+=(r>>>0).toString(16).padStart(8,"0")}return`0x${t.slice(0,64)}`}function Dn(e){let t=typeof e=="number"?String(e):e;return Fn.test(t)?`0x${(t.startsWith("0x")||t.startsWith("0X")?t.slice(2):t).toLowerCase()}`:ri(t)}function Ln(e,t){if(typeof e=="number"||t==="deterministic")return Dn(e);let n=String(e);return Fn.test(n)?Dn(n):n.startsWith("0x")||n.startsWith("0X")?n:`0x${n}`}function ii(e){if(!e&&typeof tokenData<"u"&&tokenData?.hash)return{hash:tokenData.hash,tokenId:String(tokenData.tokenId),externalAssetDependencies:ti(tokenData.externalAssetDependencies),preferredIPFSGateway:Zr(tokenData.preferredIPFSGateway||Pn),preferredArweaveGateway:tokenData.preferredArweaveGateway};let t=typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams;return{hash:e?ni(e):t.get("hash")||`0x${ei(64)}`,tokenId:"18009999",externalAssetDependencies:[{cid:Mn}],preferredIPFSGateway:Pn}}function Ut(e){let t=e?.useCache!==!1;if(t&&We&&!e?.hash)return We;let n=ii(e?.hash);return t?We=n:We||(We=n),n}function Vn(e){return new Array(32).fill(null).map((t,n)=>parseInt(e.hash.slice(2+n*2,4+n*2),16))}Gt();var ht="$cyberartTa",de=class extends Error{constructor(t){super(t),this.name="IncompatibleCartStateError"}},jt={Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array};function di(e){for(let t of Object.keys(jt))if(e instanceof jt[t])return t}function Bn(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function ge(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Wt(e){return ge(e)?typeof e[ht]=="string"&&Array.isArray(e.d):!1}function ui(e){return e==null?!1:typeof e=="function"?!0:!(typeof e!="object"||Array.isArray(e)||Bn(e)||ge(e))}var ci=new Set(["audioContextStarted","midiSynths","keepRatioPrimed","audioInitStarted","musicSeekApplied"]);function Kn(e){return e===null?"null":Wt(e)?String(e[ht]):Array.isArray(e)?"array":ge(e)?"object":typeof e}function li(e,t){return e===t||e==="null"||t==="null"}function Un(e){return e.trim().toLowerCase().replace(/^0x/,"")}function $n(e,t,n,r){if(!(!n&&!r)&&Un(e)!==Un(t))throw new de(`Generative cart state is for seed "${t}", but the live token is "${e}"`)}function Ve(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Gn(e,t){let n=e.dimensions;if(n&&Ve(n.width)&&Ve(n.height))return n;if(t&&Ve(t.width)&&Ve(t.height))return{width:t.width,height:t.height};if(ge(e.state)){let r=e.state.containerWidth,i=e.state.containerHeight;if(Ve(r)&&Ve(i))return{width:r,height:i}}return null}function He(e,t=new WeakSet){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:null;if(!(typeof e=="function"||typeof e>"u"||typeof e=="bigint"||typeof e=="symbol")){if(Bn(e)){let n=di(e);return n?{[ht]:n,d:Array.from(e)}:void 0}if(typeof e=="object"&&!t.has(e)){t.add(e);try{if(Array.isArray(e)){let i=[],o=0;for(let d of e){let u=He(d,t);u!==void 0&&(i.push(u),o++)}return e.length>0&&o===0?void 0:i}if(!ge(e)||ui(e))return;let n=Object.keys(e),r={};for(let i of n){if(ci.has(i))continue;let o=He(e[i],t);o!==void 0&&(r[i]=o)}return n.length>0&&Object.keys(r).length===0?void 0:r}finally{t.delete(e)}}}}function qe(e){if(Wt(e)){let t=jt[e[ht]];return t?new t(e.d.map(n=>Number(n))):e}if(Array.isArray(e))return e.map(t=>qe(t));if(ge(e)){let t={};for(let n of Object.keys(e))t[n]=qe(e[n]);return t}return e}function zt(e,t,n,r,i=!0){if(i&&n&&r&&n!==r)throw new de(`Cart state is for "${r}", but the live cart is "${n}"`);if(!ge(t)){if(i)throw new de("Cart state snapshot is empty");return}let o=Object.keys(t);if(o.length===0){if(i)throw new de("Cart state snapshot is empty");return}let d=He(e);if(!ge(d)||Object.keys(d).length===0){if(i)throw new de("Live cart has no serializable state");return}let u=o.filter(m=>m in d);if(u.length===0){if(i)throw new de("Cart state snapshot does not overlap the live cart shape");return}for(let m of u){let g=Kn(d[m]),b=Kn(t[m]);if(!li(g,b))throw new de(`Cart state field "${m}" has type ${b}, live cart expects ${g}`);if(g==="object"){let h=t[m],A=e[m];ge(h)&&!Wt(h)&&zt(A,h,void 0,void 0,!1)}}}function jn(e,t){if(!ge(e)||!ge(t))return;let n=He(e);if(ge(n))for(let r of Object.keys(t))r in n&&(e[r]=qe(t[r]))}function ye(e){let t=typeof e=="string"?JSON.parse(e):e;if(!t||typeof t!="object")throw new de("Cart state bundle is not an object");if(t.version!==1)throw new de(`Unsupported cart state version ${String(t.version)}`);if(typeof t.seed!="string"||typeof t.framesElapsed!="number")throw new de("Cart state bundle is missing seed or framesElapsed");return t}var Ae="cyberart.asset.ready",Ce="cyberart.asset.failed";function Re(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Wn(e){return{type:e.status==="ready"?Ae:Ce,kind:"state",payload:e.detail===void 0?{id:e.id}:{id:e.id,detail:e.detail}}}function mi(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.startTime=="number"&&typeof t.lastSimulationUpdateAt=="number"?Math.max(0,t.lastSimulationUpdateAt-t.startTime):0}function fi(e,t){if(typeof window.resizeTo!="function")return!1;try{if(window.top!==window)return!1}catch{return!1}let n=Math.max(1,Math.round(e)),r=Math.max(1,Math.round(t)),i=Math.max(0,window.outerWidth-window.innerWidth),o=Math.max(0,window.outerHeight-window.innerHeight);try{window.resizeTo(n+i,r+o)}catch{return!1}return Math.abs(window.innerWidth-n)<=8&&Math.abs(window.innerHeight-r)<=8}var hi=[[0,0],[16,9],[9,16],[4,3],[3,4],[2,1],[1,2],[3,1],[1,3],[1,1]],Yt=hi[0],gi=Yt[0]/Yt[1],qt=30,yi=120,bi=3840/2160,vi=2160/3840,gt=class{constructor(t=qt,n=!1,r=window.innerWidth,i=window.innerHeight,o=!0,d,u={}){this.framesElapsed=0;this.frameRate=qt;this._paused=!1;this.savedToken=!1;this.prepared=!1;this.loopRunning=!1;this.fallbackAudio=[];this.audioLibrariesInternal=[];this.virtualClock=null;this.scriptedActions=[];this.initialScriptedActions=[];this.appliedActions=[];this.consumedActionIndexes=new Set;this.outboundEvents=[];this.consecutiveErrorCount=0;this.lastErrorLogAt=0;this.reinitStayPaused=!1;this.reinitPending=!1;this.lastExportedFramebuffer=null;this.pinnedOutput=null;this.pinViewportAtImport=null;this.importing=!1;this.drawLoop=this.drawLoop.bind(this),this.loadCart=this.loadCart.bind(this),this.prepareCart=this.prepareCart.bind(this),this.beginPlayback=this.beginPlayback.bind(this),this.reinit=this.reinit.bind(this),this.tuneFramerate=this.tuneFramerate.bind(this),this.container=u.container,this.seed=u.seed,this.captureKeyboard=u.captureKeyboard??!0,this.customState=u.customState,this.hostChannel=u.hostChannel,this.fallbackAudio=mt(u.audio),this.audioLibrariesInternal=this.fallbackAudio,this.kind=u.kind??"render",this.onFrameTiming=u.onFrameTiming;let m=u.deterministic;this.deterministic=!!m;let g=m&&typeof m=="object"?m:{};if(this.deterministic){if(u.clock){let b=u.clock;if(typeof b.advance!="function")throw new Error("deterministic mode requires a virtual clock with advance()");this.virtualClock=b,this.clock=b}else this.virtualClock=In(g.origin??0),this.clock=this.virtualClock;this.initialScriptedActions=Re(g.actions??[]),this.scriptedActions=Re(this.initialScriptedActions)}else this.clock=u.clock??dt();this.isBodyCanvas=this.container?!1:o,this.autoMode=n,this.aspectRatio=gi,this.selectedAsp=Yt,this.isFullscreen=!!document.fullscreenElement,this.updateFrameRate(t),this.tempUnpause=!1,this.synchronous=Me,this.containerWidth=r,this.containerHeight=i,this.gameManager=d,this.init(!0)}setGameManager(t){this.gameManager=t}reinit(t){if(!this.importing){if(this.shouldKeepPinnedOutput()){this.fitPinnedCanvas();return}this.reinitPending||(this.reinitStayPaused=this._paused,this.reinitPending=!0),this.paused=!0,clearTimeout(this.reinitTimeout),this.reinitTimeout=setTimeout(()=>{if(this.importing){this.paused=this.reinitStayPaused,this.reinitPending=!1;return}this.updateInProgress?this.reinit(t):(this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.clearPinnedOutput(),this.init(),this.reloadCart(),this.paused=this.reinitStayPaused,this.reinitPending=!1)},150)}}initSeed(){this.tokenData=this.seed?Ut({hash:this.seed,useCache:!1}):Ut(),this.rawParams=Vn(this.tokenData),this.mintNo=parseInt(this.tokenData.tokenId)%1e6,console.log("token",this.mintNo,this.tokenData.hash)}init(t=!1){t&&this.initSeed(),this.pureAspectUpdate(this.selectedAsp);let n=this.aspectRatio,[r,i]=Rn(n,this.containerWidth,this.containerHeight);r*=me,i*=me,this.width=~~r,this.height=~~i,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.kind!=="calculation"&&(this.mainCanvas?this.mainCanvas.setSize(this.width,this.height):this.mainCanvas=new ct(this.width,this.height,1,this.isBodyCanvas,this.canvasMountOptions()))}loadCart(t){this.prepareCart(t)&&this.beginPlayback()}prepareCart(t){if(this.prepared)return!0;try{let n=~~(this.width/1),r=~~(this.height/this.width*n),i=new Le(this.tokenData),o=new ut(n,r,i,this.rawParams,t,{gameManager:this.gameManager,canvasMount:this.canvasMountOptions(),customState:this.customState,captureKeyboard:this.deterministic?!1:this.captureKeyboard,hostChannel:this.hostChannel,clock:this.clock,listenToPointer:!this.deterministic,kind:this.kind});return this.animation=o,this.animationCart=t,this.paused=!1,this.framesElapsed=0,this.outboundEvents=[],this.scriptedActions=Re(this.initialScriptedActions),this.appliedActions=[],this.consumedActionIndexes=new Set,this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.deterministic&&this.hostChannel&&(this.outboundUnsubscribe=this.hostChannel.onEvent(d=>{this.outboundEvents.push(d)})),this.R=i,this.applyCartFrameRate(t,o),this.resolveAudioLibraries(t),this.prepared=!0,!0}catch(n){return console.error(n),!1}}applyCartFrameRate(t,n){let r=t.metadata,i=r?.frameRate??qt,o=n.cartState?.visualMode??n.featureState?.visualMode,d=o&&r?.frameRateByVisualMode?r.frameRateByVisualMode[o]:void 0;this.updateFrameRate(typeof d=="number"&&d>0?d:i)}get audioLibraries(){return this.audioLibrariesInternal}get needsAudio(){return this.audioLibrariesInternal.length>0}resolveAudioLibraries(t){this.audioLibrariesInternal=mt(t.metadata?.audio)}async unlockAudio(){if(this.audioLibrariesInternal.length===0)return;let t=ft(this.audioLibrariesInternal);if(Me){for(let n of t)await n.load();return}for(let n of t)await n.unlock()}async resumeAudioLibraries(){if(!(this.paused||Me))for(let t of ft(this.audioLibrariesInternal))try{await t.resumeIfSuspended()}catch(n){console.error(`Failed to resume audio library "${t.id}" after reload`,n)}}beginPlayback(){!this.prepared||this.loopRunning||(this.prepared=!1,this.loopRunning=!0,this.consecutiveErrorCount=0,!this.deterministic&&(this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)))}get isPrepared(){return this.prepared}get isLoopRunning(){return this.loopRunning}get isDeterministic(){return this.deterministic}getClock(){return{now:this.clock.now(),framesElapsed:this.framesElapsed,frameRate:this.frameRate}}getRandomState(){return this.requirePreparedAnimation().getRandomState()}schedule(t){this.scriptedActions.push(Re(t))}async getReplayMetadata(){let t=await this.exportState();return{seed:this.tokenData.hash,clock:this.getClock(),rng:this.getRandomState(),actions:Re(this.scriptedActions),applied:Re(this.appliedActions),events:Re(this.outboundEvents),state:t.state}}async step(t=1){if(!this.deterministic)throw new Error("step() requires createRuntime({ deterministic: true })");this.requirePreparedAnimation(),this.prepared&&!this.loopRunning&&this.beginPlayback(),this.paused=!1;let n=Math.max(0,Math.floor(t));for(let r=0;r<n&&this.animation;r++){let i=this.framesElapsed;if(this.applyScheduledActions(i),await this.processFrame(this.clock.now(),{ignorePause:!0,scheduleNext:!1}),this.framesElapsed===i||(this.virtualClock?.advance(this.targetDrawTime),!this.loopRunning))break}}async advance(t){let n=Math.max(0,Math.round(t/this.targetDrawTime));await this.step(n)}applyScheduledActions(t){let n=this.animation;n&&this.scriptedActions.forEach((r,i)=>{r.atFrame===t&&(this.consumedActionIndexes.has(i)||(this.consumedActionIndexes.add(i),r.type==="pointer"?n.injectPointer(r.pointer.kind,r.pointer.x,r.pointer.y):r.type==="key"?n.injectKey(r.key):r.type==="event"?this.hostChannel?.dispatch(r.event):r.type==="asset"&&this.hostChannel?.dispatch(Wn(r)),this.appliedActions.push({frame:t,action:r})))})}get paused(){return this._paused}set paused(t){this._paused!==t&&(this._paused=t,this.animation?.setPaused(t))}async waitUntilUpdateIdle(){for(;this.updateInProgress;)await new Promise(t=>{this.deterministic?queueMicrotask(t):typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>t()):setTimeout(t,0)})}requirePreparedAnimation(){if(!this.animation)throw new Error("No prepared cart");return this.animation}async exportState(){let t=this.requirePreparedAnimation(),n=this._paused;this.paused=!0,await this.waitUntilUpdateIdle();try{this.kind!=="calculation"?this.lastExportedFramebuffer=t.captureFramebuffer():this.lastExportedFramebuffer=null;let r=t.getCanvas();return{version:1,cartId:this.animationCart?.metadata?.id,generative:this.animationCart?.metadata?.generative,seed:this.tokenData.hash,framesElapsed:this.framesElapsed,elapsedSinceStart:t.getElapsedSinceStart(),dimensions:{width:r?.width??this.width,height:r?.height??this.height,cssWidth:this.containerWidth,cssHeight:this.containerHeight,dpr:me},state:He(t.cartState)}}finally{this.paused=n}}async exportStateJSON(){return JSON.stringify(await this.exportState())}peekExportedFramebuffer(){return this.lastExportedFramebuffer}peekSeed(){return this.tokenData?.hash}isGenerative(){return this.animationCart?.metadata?.generative===!0}async importState(t,n){let r=this.requirePreparedAnimation(),i=ye(t),o=this._paused,d=this.loopRunning;this.paused=!0,await this.waitUntilUpdateIdle(),zt(r.cartState,i.state,this.animationCart?.metadata?.id,i.cartId),$n(this.tokenData.hash,i.seed,this.animationCart?.metadata?.generative,i.generative),clearTimeout(this.reinitTimeout),this.reinitPending=!1,this.importing=!0;let u=Gn(i,n?.framebuffer??this.lastExportedFramebuffer);if(u){this.pinOutputSize(u);let b=u.cssWidth??u.width/me,h=u.cssHeight??u.height/me;fi(b,h),this.syncContainerFromDom(),this.pinViewportAtImport={w:this.containerWidth,h:this.containerHeight}}let m=this.customState,g=!1;try{if(this.customState=qe(i.state),this.unloadCart(),!this.prepareCart(this.animationCart))throw new Error("Failed to prepare cart while loading state");this.animation.cartState!==this.customState&&jn(this.animation.cartState,i.state),this.framesElapsed=i.framesElapsed;let b=this.animation,h=b.cartState,A=typeof i.elapsedSinceStart=="number"?i.elapsedSinceStart:mi(h);b.restoreClock(A,typeof h?.startTime=="number"?h.startTime:void 0),o&&b.setPaused(!0);let F=n?.framebuffer??this.lastExportedFramebuffer;this.kind!=="calculation"&&(F&&b.restoreFramebuffer(F)?h.keepRatioPrimed=!0:await b.renderAnimation(this.framesElapsed,this.rawParams)),this.fitPinnedCanvas(),g=!0}catch(b){throw this.clearPinnedOutput(),this.customState=m,this.paused=o,this.animationCart&&(this.syncContainerFromDom(),this.init(),this.reloadCart()),b}finally{this.importing=!1,g&&(this.customState=m,this.paused=o,d&&this.beginPlayback())}}unloadCart(){this.loopRunning=!1,this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.drawLoopTimeout&&clearTimeout(this.drawLoopTimeout),this.animation?.teardown(),this.animation=void 0,this.prepared=!1,this.audioLibrariesInternal=this.fallbackAudio,this.mainCanvas?.clearAll()}reloadCart(t=!1){let n=this.animationCart;if(!n)return;this.pinnedOutput&&(this.clearPinnedOutput(),this.syncContainerFromDom(),this.init());let r=this.reinitPending?this.reinitStayPaused:this._paused;this.unloadCart(),t&&this.initSeed(),this.loadCart(n),this.paused=r,!this.paused&&!Me&&this.resumeAudioLibraries()}getFrameRate(){return this.frameRate}updateFrameRate(t){if(this.frameRate=t,t>=1)this.targetDrawTime=1e3/t;else{let r=1/(2-t);this.targetDrawTime=1e3/r}this.drawTime=this.targetDrawTime}canvasMountOptions(){return{container:this.container,adoptFromDocument:!this.container}}syncContainerFromDom(){if(this.container){this.containerWidth=this.container.clientWidth||this.containerWidth,this.containerHeight=this.container.clientHeight||this.containerHeight;return}this.containerWidth=window.innerWidth,this.containerHeight=window.innerHeight}pinOutputSize(t){this.pinnedOutput=t,this.width=~~t.width,this.height=~~t.height,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.aspectRatio=this.width/this.height,this.mainCanvas&&this.mainCanvas.setSize(this.width,this.height)}shouldKeepPinnedOutput(){return this.pinnedOutput?(this.syncContainerFromDom(),this.viewportMatches(this.pinnedCssSize())?!0:!!(this.pinViewportAtImport&&this.viewportMatches(this.pinViewportAtImport))):!1}pinnedCssSize(){let t=this.pinnedOutput;return{w:t.cssWidth??t.width/me,h:t.cssHeight??t.height/me}}viewportMatches(t){return Math.abs(this.containerWidth-t.w)<8&&Math.abs(this.containerHeight-t.h)<8}fitPinnedCanvas(){let t=this.pinnedOutput,n=this.canvas;if(!t||!n)return;this.container&&!this.container.style.position&&(this.container.style.position="relative");let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=t.width/me,d=t.height/me;if(o<1||d<1||r<1||i<1)return;let u=Math.min(r/o,i/d),m=o*u,g=d*u;n.style.position="absolute",n.style.left="50%",n.style.top="50%",n.style.transform="translate(-50%, -50%)",n.style.margin="0",n.style.width=`${m}px`,n.style.height=`${g}px`,n.style.imageRendering=Math.abs(u-1)<.01?"auto":"pixelated"}clearPinnedOutput(){let t=this.canvas;this.pinnedOutput=null,this.pinViewportAtImport=null,t&&(t.style.position="",t.style.left="",t.style.top="",t.style.transform="",t.style.imageRendering="",t.style.width="",t.style.height="",t.style.margin="auto")}get canvas(){return this.animation?.getCanvas()??this.mainCanvas?.canvas}destroy(){this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.clearPinnedOutput(),this.unloadCart(),clearTimeout(this.reinitTimeout),this.mainCanvas&&!this.mainCanvas.adopted&&this.mainCanvas.canvas.remove()}drawIt(){}tuneFramerate(t){let n=this.lastCall||t;this.lastCall=t,this.drawTime=Math.max(0,this.drawTime+this.targetDrawTime-this.lastCall+n)}async processFrame(t,n={}){let r=n.ignorePause===!0,i=n.scheduleNext!==!1;if(!this.loopRunning&&!r)return;let o=!1,d,u="update",m=this.onFrameTiming,g=0,b=0,h=0;try{if(r||!this.paused||this.tempUnpause){if(!Me&&!r&&this.tuneFramerate(t),!this.animation)return;u="update",this.updateInProgress=!0;let F=m?performance.now():0;if(await this.animation.updateAnimationState(this.framesElapsed,this.rawParams,t),m&&(g=performance.now()-F),this.updateInProgress=!1,this.kind!=="calculation"){u="render";let R=m?performance.now():0;await this.animation.renderAnimation(this.framesElapsed,this.rawParams,t),m&&(b=performance.now()-R)}if(this.autoMode&&this.animation.cartState.saveToken&&!this.savedToken&&!new URLSearchParams(window.location.search).get("hash")){let L=localStorage.getItem("goodones"),_=JSON.stringify(L?[...JSON.parse(L),this.tokenData.hash]:[this.tokenData.hash]);localStorage.setItem("goodones",_),this.savedToken=!0,this.mainCanvas&&localStorage.setItem(this.tokenData.hash,this.mainCanvas.canvas.toDataURL("image/png")),window.location.reload(),this.loopRunning=!1;return}this.framesElapsed++,this.tempUnpause&&(this.tempUnpause=!1)}u="draw";let A=m?performance.now():0;this.drawIt(),m&&(h=performance.now()-A)}catch(A){o=!0,d=A,this.handleFrameError(A,u)}finally{this.updateInProgress=!1,m&&!o&&m({frame:this.framesElapsed,updateMs:g,renderMs:b,drawMs:h,totalMs:g+b+h})}o?(this.consecutiveErrorCount++,this.consecutiveErrorCount>=yi&&(this.loopRunning=!1,this.onError?.(d,{phase:u,consecutive:this.consecutiveErrorCount,stopped:!0}))):this.consecutiveErrorCount=0,!(!this.loopRunning||!i)&&(this.drawLoopTimeout=setTimeout(()=>{this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)},this.drawTime))}async drawLoop(t){await this.processFrame(t,{scheduleNext:!0})}handleFrameError(t,n){let r=performance.now();r-this.lastErrorLogAt>=1e3&&(this.lastErrorLogAt=r,console.error(`Animation ${n} error:`,t)),this.consecutiveErrorCount===0&&this.onError?.(t,{phase:n,consecutive:1,stopped:!1})}pureAspectUpdate(t){if(t[0]===0&&t[1]===0){let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=r/i;this.aspectRatio=Math.min(bi,Math.max(vi,o))}else this.aspectRatio=t[0]/t[1]}};var Si="HostChannel has been destroyed",yt=class{constructor(){this.inbound=[];this.listeners=[];this.closed=!1}dispatch(t){this.requireOpen(),this.inbound.push(t),this.inbound.length>32&&this.inbound.splice(0,this.inbound.length-32)}consume(){if(this.requireOpen(),this.inbound.length===0)return[];let t=this.inbound;return this.inbound=[],t}emit(t){this.requireOpen();for(let n of this.listeners)n(t)}onEvent(t){return this.requireOpen(),this.listeners.push(t),()=>{this.listeners=this.listeners.filter(n=>n!==t)}}clearInbound(){this.requireOpen(),this.inbound=[]}clear(){this.inbound=[],this.listeners=[]}close(){this.closed=!0,this.clear()}requireOpen(){if(this.closed)throw new Error(Si)}};var pe=2,Xt=1,Qt="0.0.5",qn="0",Yn="1970-01-01T00:00:00.000Z";function ue(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function vt(e){return JSON.parse(JSON.stringify(e))}function re(e,t,n,r){e.push(r?{code:t,detail:n,path:r}:{code:t,detail:n})}function Jn(e,t,n){try{let r=JSON.stringify(e);if(r===void 0){re(n,"invalid-field",`${t} is not JSON-serializable`,t);return}return JSON.parse(r)}catch{re(n,"invalid-field",`${t} is not JSON-serializable`,t);return}}function se(e){return typeof e=="string"&&e.length>0}function bt(e){return typeof e=="number"&&Number.isFinite(e)}function Ai(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}function Zt(e){return!ue(e)||typeof e.schemaVersion=="number"?!1:typeof e.version=="number"&&typeof e.seed=="string"&&typeof e.framesElapsed=="number"&&"state"in e}function St(e){if(ue(e)){if(typeof e.schemaVersion=="number")return Number.isInteger(e.schemaVersion)?e.schemaVersion:void 0;if(Zt(e))return Xt}}function Jt(e,t,n){try{return vt(ye(e))}catch(r){let i=r instanceof Error?r.message:"engineState is not a cart state bundle";re(n,"invalid-engine-state",i,t);return}}function Ci(e,t,n){if(!ue(e)){re(n,"invalid-field","cart must be an object",t);return}se(e.id)||re(n,"invalid-field","cart.id must be a non-empty string",`${t}.id`),se(e.version)||re(n,"invalid-field","cart.version must be a non-empty string",`${t}.version`);let r={id:typeof e.id=="string"?e.id:"",version:typeof e.version=="string"?e.version:""};return e.generative!==void 0&&(typeof e.generative!="boolean"?re(n,"invalid-field","cart.generative must be a boolean",`${t}.generative`):r.generative=e.generative),r.id&&r.version?r:void 0}function Ei(e,t,n){if(!ue(e)){re(n,"invalid-field","clock must be an object",t);return}if(!bt(e.framesElapsed)){re(n,"invalid-field","clock.framesElapsed must be a finite number",`${t}.framesElapsed`);return}let r={framesElapsed:e.framesElapsed};return e.elapsedSinceStart!==void 0&&(bt(e.elapsedSinceStart)?r.elapsedSinceStart=e.elapsedSinceStart:re(n,"invalid-field","clock.elapsedSinceStart must be a finite number",`${t}.elapsedSinceStart`)),e.now!==void 0&&(bt(e.now)?r.now=e.now:re(n,"invalid-field","clock.now must be a finite number",`${t}.now`)),e.frameRate!==void 0&&(bt(e.frameRate)?r.frameRate=e.frameRate:re(n,"invalid-field","clock.frameRate must be a finite number",`${t}.frameRate`)),r}function wi(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){re(n,"invalid-field","modules must be an array",t);return}let r=[];return e.forEach((i,o)=>{let d=`${t}[${o}]`;if(!ue(i)||!se(i.id)||!se(i.version)){re(n,"invalid-field","module refs need non-empty id and version",d);return}r.push({id:i.id,version:i.version})}),r}function ki(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){re(n,"invalid-field","assets must be an array",t);return}let r=[];return e.forEach((i,o)=>{let d=`${t}[${o}]`;if(!ue(i)||!se(i.id)){re(n,"invalid-field","asset refs need a non-empty id",d);return}let u={id:i.id};i.version!==void 0&&(se(i.version)?u.version=i.version:re(n,"invalid-field","asset.version must be a non-empty string",`${d}.version`)),i.ref!==void 0&&(se(i.ref)?u.ref=i.ref:re(n,"invalid-field","asset.ref must be a non-empty string",`${d}.ref`)),r.push(u)}),r}function Ri(e,t,n){if(e===void 0)return;if(!ue(e)||!se(e.seed)){re(n,"invalid-field","rng must include a seed",t);return}if(!ue(e.prngA)||!ue(e.prngB)){re(n,"invalid-field","rng must include prngA and prngB",t);return}if(typeof e.useA!="boolean"){re(n,"invalid-field","rng.useA must be a boolean",`${t}.useA`);return}return Jn(e,t,n)}function xi(e,t,n){if(e===void 0)return;if(!ue(e)){re(n,"invalid-field","provenance must be an object",t);return}let r={};return e.source!==void 0&&(se(e.source)?r.source=e.source:re(n,"invalid-field","provenance.source must be a non-empty string",`${t}.source`)),e.integrity!==void 0&&(!ue(e.integrity)||!se(e.integrity.alg)||!se(e.integrity.hash)?re(n,"invalid-field","provenance.integrity needs alg and hash strings",`${t}.integrity`):r.integrity={alg:e.integrity.alg,hash:e.integrity.hash}),r}function Xn(e,t){e.schemaVersion!==void 0&&e.schemaVersion!==pe&&re(t,"invalid-schema",`defineSnapshot produces schema ${pe}`,"schemaVersion"),se(e.seed)||re(t,"invalid-field","seed must be a non-empty string","seed");let n=e.runtimeVersion===void 0?Qt:e.runtimeVersion;se(n)||re(t,"invalid-field","runtimeVersion must be a non-empty string","runtimeVersion");let r=e.createdAt===void 0?new Date().toISOString():e.createdAt;Ai(r)||re(t,"invalid-field","createdAt must be an ISO-8601 date","createdAt");let i=Ci(e.cart,"cart",t),o=Ei(e.clock,"clock",t),d=Jt(e.engineState,"engineState",t),u=wi(e.modules,"modules",t),m=ki(e.assets,"assets",t),g=Ri(e.rng,"rng",t),b=xi(e.provenance,"provenance",t),h;if(e.hostState!==void 0&&(h=Jn(e.hostState,"hostState",t)),e.hostStateRef!==void 0&&!se(e.hostStateRef)&&re(t,"invalid-field","hostStateRef must be a non-empty string","hostStateRef"),t.length>0||!i||!o||!d||!se(e.seed))return;let A={schemaVersion:pe,runtimeVersion:n,cart:i,seed:e.seed,clock:o,engineState:d,createdAt:r};return u&&u.length>0&&(A.modules=u),g&&(A.rng=g),h!==void 0&&(A.hostState=h),se(e.hostStateRef)&&(A.hostStateRef=e.hostStateRef),m&&m.length>0&&(A.assets=m),b&&(b.source||b.integrity)&&(A.provenance=b),A}function Ii(e){if(!ue(e))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot input is not an object"}]};let t=[],n=Xn(e,t);return!n||t.length>0?{ok:!1,errors:t}:{ok:!0,snapshot:n}}function At(e,t){return se(e.cartId)?Ii({cart:{id:e.cartId,version:t?.cartVersion??qn,generative:e.generative},modules:t?.modules,seed:e.seed,rng:t?.rng,clock:t?.clock??{framesElapsed:e.framesElapsed,elapsedSinceStart:e.elapsedSinceStart},engineState:e,hostState:t?.hostState,hostStateRef:t?.hostStateRef,assets:t?.assets,createdAt:t?.createdAt,provenance:t?.provenance,runtimeVersion:t?.runtimeVersion}):{ok:!1,errors:[{code:"invalid-field",detail:"cart.id is required",path:"cart.id"}]}}function zn(e){let t=vt(e),n={schemaVersion:Xt,engineState:t,seed:t.seed,clock:{framesElapsed:t.framesElapsed,elapsedSinceStart:t.elapsedSinceStart}};return t.cartId&&(n.cart={id:t.cartId,version:qn,generative:t.generative}),n}function en(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return{ok:!1,errors:[{code:"invalid-json",detail:"Snapshot JSON could not be parsed"}]}}if(!ue(t))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(Zt(t))try{return{ok:!0,snapshot:zn(ye(t))}}catch(r){return{ok:!1,errors:[{code:"invalid-engine-state",detail:r instanceof Error?r.message:"Cart state bundle is invalid"}]}}let n=St(t);if(n===void 0)return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is missing schemaVersion and is not a cart state bundle",path:"schemaVersion"}]};if(n===Xt){let r=[],i=Jt(t.engineState,"engineState",r);return!i||r.length>0?{ok:!1,errors:r}:{ok:!0,snapshot:zn(i)}}if(n!==pe){if(n>pe)return{ok:!1,errors:[{code:"unsupported-schema",detail:`Snapshot schema ${n} is newer than ${pe}`,path:"schemaVersion"}]};let r=[],i=Jt(t.engineState,"engineState",r);return i?{ok:!0,snapshot:{schemaVersion:n,engineState:i,seed:typeof t.seed=="string"?t.seed:i.seed,clock:{framesElapsed:i.framesElapsed,elapsedSinceStart:i.elapsedSinceStart}}}:{ok:!1,errors:r.length?r:[{code:"invalid-snapshot",detail:`Snapshot schema ${n} is missing engineState`,path:"engineState"}]}}return Ye(t)}function Ye(e){if(!ue(e))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(e.schemaVersion!==pe)return{ok:!1,errors:[{code:"invalid-schema",detail:`Expected snapshot schema ${pe}`,path:"schemaVersion"}]};let t=[],n=Xn(e,t);return!n||t.length>0?{ok:!1,errors:t}:{ok:!0,snapshot:n}}function Oe(e){return e.map(t=>t.detail).join("; ")}function Qn(e){if(Zt(e))return ye(e);if(ue(e)&&e.engineState!==void 0)return ye(e.engineState);throw new Error("Legacy snapshot is missing engine state")}function Ti(){return[{from:1,to:2,migrate:Fi}]}function Pi(e){let t=[...e?.migrations??Ti()],n=new Map;for(let r of t){if(!Number.isInteger(r.from)||!Number.isInteger(r.to)||r.to!==r.from+1)throw new Error(`Snapshot migration must step from n to n+1 (got ${String(r.from)} \u2192 ${String(r.to)})`);if(typeof r.migrate!="function")throw new Error(`Snapshot migration ${r.from} \u2192 ${r.to} is missing migrate()`);if(n.has(r.from))throw new Error(`Duplicate snapshot migration from schema ${r.from}`);n.set(r.from,r)}return{migrations:t,get(r){return n.get(r)}}}var Di=Pi();function Mi(){return Di}function Fi(e){let t=Qn(e),n=At(t,{createdAt:Yn,runtimeVersion:Qt});if(n.ok===!1)throw new Error(Oe(n.errors));return n.snapshot}function Zn(e){try{return vt(e)}catch{return}}function er(e,t=Mi()){let n=Zn(e);if(n===void 0)return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not JSON-serializable"}]};let r=n,i=St(r);if(i===void 0){let o=en(r);if(o.ok===!1)return o;r=o.snapshot,i=o.snapshot.schemaVersion}if(i>pe)return{ok:!1,errors:[{code:"unsupported-schema",detail:`Snapshot schema ${i} is newer than ${pe}`,path:"schemaVersion"}]};if(i===pe)return Ye(r);for(;i<pe;){let o=t.get(i);if(!o)return{ok:!1,errors:[{code:"missing-migration",detail:`No snapshot migration from schema ${i} to ${i+1}`,path:"schemaVersion"}]};let d;try{d=o.migrate(Zn(r))}catch(m){let g=m instanceof Error?m.message:"Migration threw";return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} failed: ${g}`,path:"schemaVersion"}]}}let u=St(d);if(u!==o.to)return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} produced schema ${String(u)}`,path:"schemaVersion"}]};if(o.to===pe){let m=Ye(d);if(m.ok===!1)return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} did not produce a valid snapshot`,path:"schemaVersion"},...m.errors]};r=m.snapshot}else r=d;i=o.to}return Ye(r)}function tr(e,t){let n=e;if(typeof e=="string")try{n=JSON.parse(e)}catch{return{ok:!1,errors:[{code:"invalid-json",detail:"Snapshot JSON could not be parsed"}]}}if(!n||typeof n!="object")return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(typeof n.schemaVersion=="number"){let i=er(n,t);if(i.ok===!1)return i;try{return{ok:!0,bundle:ye(i.snapshot.engineState),snapshot:i.snapshot}}catch(o){return{ok:!1,errors:[{code:"invalid-engine-state",detail:o instanceof Error?o.message:"engineState is not a cart state bundle",path:"engineState"}]}}}try{return{ok:!0,bundle:ye(n)}}catch(i){return{ok:!1,errors:[{code:"invalid-engine-state",detail:i instanceof Error?i.message:"Cart state bundle is invalid"}]}}}function nr(e,t){let n=en(e);return n.ok===!1?n:er(n.snapshot,t)}var Li=["image","audio","font","spritesheet"],Vi=["timeout","cors","not-found","invalid","aborted","resolver"],Je="cyberart:fallback/silent",rr="Asset preloader has been destroyed",Hi=4,Oi=new Set(Li),_i=new Set(Vi),Ni={timeout:"asset load timed out",cors:"CORS blocked this asset","not-found":"asset was not found",invalid:"asset declaration or resource is invalid",aborted:"asset load was aborted",resolver:"asset resolver failed"};function Ki(e){return typeof e=="string"&&Oi.has(e)}function Ui(e){return typeof e=="string"&&_i.has(e)}function tn(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.id=="string"&&typeof t.ref=="string"&&Ui(t.code)&&typeof t.message=="string"}function oe(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message&&e.message.length>0?e.message:Ni[e.code]}}function _e(e,t){return{type:e==="ready"?Ae:Ce,kind:"state",payload:t}}function Bi(e){return e instanceof Error&&e.name==="AbortError"||typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"}function nn(e){return e?{...e}:void 0}function be(e){let t={id:e.id,ref:e.ref,type:e.type,url:e.url};return e.integrity!==void 0&&(t.integrity=e.integrity),e.provenance&&(t.provenance=nn(e.provenance)),e.cors!==void 0&&(t.cors=e.cors),e.usedFallback&&(t.usedFallback=!0),e.managed&&(t.managed=!0),t}function Xe(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message}}function $i(e){if(e.state==="ready"){let t={state:"ready",resource:be(e.resource)};return e.failure&&(t.failure=Xe(e.failure)),t}return e.state==="failed"?{state:"failed",failure:Xe(e.failure)}:{state:e.state}}function Gi(e){if(!e||typeof e!="object")return oe({id:"",ref:"",code:"invalid",message:"declaration is required"});if(typeof e.id!="string"||e.id.length===0)return oe({id:typeof e.id=="string"?e.id:"",ref:typeof e.ref=="string"?e.ref:"",code:"invalid",message:"id is required"});if(typeof e.ref!="string"||e.ref.length===0)return oe({id:e.id,ref:"",code:"invalid",message:"ref is required"});if(!Ki(e.type))return oe({id:e.id,ref:e.ref,code:"invalid",message:`unsupported type ${String(e.type)}`});if(e.integrity!==void 0&&typeof e.integrity!="string")return oe({id:e.id,ref:e.ref,code:"invalid",message:"integrity must be a string"});if(e.timeoutMs!==void 0&&(typeof e.timeoutMs!="number"||!Number.isFinite(e.timeoutMs)||e.timeoutMs<0))return oe({id:e.id,ref:e.ref,code:"invalid",message:"timeoutMs must be a non-negative finite number"})}function ir(e){return{id:e.id,ref:Je,type:e.type,url:Je,usedFallback:!0,cors:"omit"}}function or(e,t){return tn(t)?{id:e.id,ref:e.ref,code:t.code,message:t.message}:Bi(t)?oe({id:e.id,ref:e.ref,code:"aborted"}):oe({id:e.id,ref:e.ref,code:"resolver",message:t instanceof Error?t.message:String(t)})}function ar(e,t){if(!t||typeof t.url!="string"||t.url.length===0)throw oe({id:e.id,ref:e.ref,code:"invalid",message:"resolver returned no url"});if(t.integrity&&e.integrity&&t.integrity!==e.integrity)throw oe({id:e.id,ref:e.ref,code:"invalid",message:"integrity mismatch"});let n=be(t);return n.id=e.id,n.ref=t.ref||e.ref,n.type=e.type,!n.integrity&&e.integrity&&(n.integrity=e.integrity),!n.provenance&&e.provenance&&(n.provenance=nn(e.provenance)),n}function sr(e){if(typeof e?.resolver?.resolve!="function")throw new Error("createAssetPreloader: resolver is required");let t=e.emitEvents!==!1,n=e.wallClockTimeout!==!1,r=new Map,i=[],o=new Map,d=new Map,u=new Map,m=new Map,g=new Map,b=new Set,h=!1;function A(p){return p.code==="aborted"||p.code==="timeout"}function F(p,D,V){let X=or(p,V);return X.code==="timeout"?X:D.aborted?oe({id:p.id,ref:p.ref,code:"aborted"}):X}function R(p,D){let V=g.get(p);V||(V=new Set,g.set(p,V)),V.add(D)}function S(p){if(p?.state==="ready")return`${p.resource.type}\0${p.resource.ref}`}function L(p,D){for(let[V,X]of g)if(V!==D&&X.has(p))return!0;for(let[V,X]of r)if(V!==D&&S(X)===p)return!0;return!1}function _(p,D){let V=new Set(g.get(p)),X=S(D);X&&V.add(X),g.delete(p);for(let l of V)L(l,p)||u.delete(l)}function K(){let p=0,D=0,V=0,X=0,l={};for(let[y,k]of r)l[y]=$i(k),k.state==="pending"||k.state==="loading"?p+=1:k.state==="failed"?V+=1:(D+=1,(k.resource.usedFallback||k.failure)&&(X+=1));return{total:r.size,pending:p,ready:D,failed:V,fallbacks:X,items:l,failures:i.map(Xe)}}function w(){if(b.size===0)return;let p=K();for(let D of b)D(p)}function v(p){i.push(Xe(p))}function s(p){h||!t||!e.dispatch||e.dispatch(p)}function c(p){if(p?.managed&&p.url.startsWith("blob:")&&!(typeof URL>"u"||typeof URL.revokeObjectURL!="function"))try{URL.revokeObjectURL(p.url)}catch{}}function I(p,D){if(h)return;let V=r.get(p);V?.state==="ready"&&c(V.resource),r.set(p,D),w()}function j(p){if(p.fallback!==void 0)return p.fallback==="silent"?{id:`${p.id}::fallback`,ref:Je,type:p.type}:typeof p.fallback=="string"?{id:`${p.id}::fallback`,ref:p.fallback,type:p.type}:{...p.fallback,id:typeof p.fallback.id=="string"&&p.fallback.id.length>0?p.fallback.id:`${p.id}::fallback`}}function Y(p,D,V){let X=`${p.type}\0${p.ref}`,l=u.get(X);if(l)return D.aborted?Promise.reject(oe({id:p.id,ref:p.ref,code:"aborted"})):(R(V,X),Promise.resolve(be(l.resource)));if(D.aborted)return Promise.reject(oe({id:p.id,ref:p.ref,code:"aborted"}));let y=m.get(X);if(!y){let T=new AbortController,P={id:p.id,ref:p.ref,type:p.type};p.integrity!==void 0&&(P.integrity=p.integrity),p.provenance&&(P.provenance=nn(p.provenance)),y={promise:Promise.resolve().then(()=>e.resolver.resolve(P,T.signal)).then(U=>{let B=ar(p,U);if(T.signal.aborted)throw oe({id:p.id,ref:p.ref,code:"aborted"});return u.set(X,{resource:be(B)}),B}).catch(U=>{throw or(p,U)}).finally(()=>{m.delete(X)}),controller:T,waiters:0},m.set(X,y)}let k=y;return k.waiters+=1,new Promise((T,P)=>{let H=!1,U=(a,C)=>{H||(H=!0,D.removeEventListener("abort",B),k.waiters-=1,C&&k.waiters<=0&&k.controller.abort(),a())},B=()=>{U(()=>P(oe({id:p.id,ref:p.ref,code:"aborted"})),!0)};if(D.aborted){B();return}D.addEventListener("abort",B,{once:!0}),k.promise.then(a=>{if(!H){if(D.aborted){B();return}R(V,X),U(()=>T(be(a)),!1)}},a=>{if(!H){if(D.aborted){B();return}U(()=>P(a),!1)}})})}function q(p,D,V){if(D.aborted)return Promise.reject(oe({id:p.id,ref:p.ref,code:"aborted"}));if(p.ref===Je)return Promise.resolve(ir(p));let X=new AbortController,l=()=>X.abort();D.addEventListener("abort",l,{once:!0});let y=p.timeoutMs??e.timeoutMs,k,T=!1;return n&&y!==void 0&&y>0&&Number.isFinite(y)&&(k=setTimeout(()=>{T=!0,X.abort()},y)),Y(p,X.signal,V).then(P=>{let H=ar(p,P);return H.id=p.id,H}).catch(P=>{throw T?oe({id:p.id,ref:p.ref,code:"timeout"}):P}).finally(()=>{k!==void 0&&clearTimeout(k),D.removeEventListener("abort",l)})}async function J(p,D,V,X){try{return{resource:await q(p,D,X)}}catch(l){let y=F(p,D,l);if(A(y)||D.aborted||V>=Hi)throw y;let k=j(p);if(!k)throw y;if(D.aborted)throw oe({id:p.id,ref:p.ref,code:"aborted"});if(p.fallback==="silent"||k.ref===Je)return{resource:ir(p),failure:y};try{let T=await J(k,D,V+1,X);return{resource:{...be(T.resource),id:p.id,usedFallback:!0},failure:y}}catch(T){let P=tn(T)&&!A(T)&&!D.aborted?T:F(p,D,T);throw!A(P)&&!D.aborted&&v(y),P}}}async function z(p,D){if(h)throw new Error(rr);let V=r.get(p.id);if(V?.state==="ready"||V?.state==="failed")return;let X=o.get(p.id);if(X){await X;return}let l=(async()=>{let y=Gi(p);if(y){I(p.id,{state:"failed",failure:y}),v(y),s(_e("failed",{id:p.id,ref:p.ref,failure:y}));return}I(p.id,{state:"loading"});let k=d.get(p.id)??new AbortController;d.has(p.id)||d.set(p.id,k);try{let T=await J(p,k.signal,D,p.id);if(h)return;if(k.signal.aborted){let P=oe({id:p.id,ref:p.ref,code:"aborted"});I(p.id,{state:"failed",failure:P}),v(P),s(_e("failed",{id:p.id,ref:p.ref,failure:P}));return}if(T.resource.id=p.id,T.failure){I(p.id,{state:"ready",resource:T.resource,failure:T.failure}),v(T.failure),s(_e("failed",{id:p.id,ref:p.ref,failure:T.failure,resource:be(T.resource)})),s(_e("ready",{id:p.id,ref:T.resource.ref,resource:be(T.resource),failure:T.failure}));return}I(p.id,{state:"ready",resource:T.resource}),s(_e("ready",{id:p.id,ref:p.ref,resource:be(T.resource)}))}catch(T){if(h)return;let P=tn(T)&&!A(T)&&!k.signal.aborted?{...Xe(T),id:p.id}:F(p,k.signal,T);I(p.id,{state:"failed",failure:P}),v(P),s(_e("failed",{id:p.id,ref:p.ref,failure:P}))}finally{d.get(p.id)===k&&d.delete(p.id)}})();o.set(p.id,l);try{await l}finally{o.delete(p.id)}}return{async preload(p){if(h)throw new Error(rr);let D=Array.isArray(p)?p:[];for(let V of D)V&&typeof V.id=="string"&&V.id.length>0&&(r.has(V.id)||r.set(V.id,{state:"pending"}),d.has(V.id)||d.set(V.id,new AbortController));return w(),await Promise.all(D.map(V=>z(V,0))),K()},get(p){let D=r.get(p);if(D?.state==="ready")return be(D.resource)},getProgress(){return K()},onProgress(p){return b.add(p),()=>{b.delete(p)}},abort(p){if(!h){if(p!==void 0){d.get(p)?.abort();return}for(let D of d.values())D.abort()}},forget(p){if(h)return;if(p===void 0){for(let V of r.values())V.state==="ready"&&c(V.resource);r.clear(),i.length=0,u.clear(),g.clear(),w();return}let D=r.get(p);D?.state==="ready"&&c(D.resource),_(p,D),r.delete(p);for(let V=i.length-1;V>=0;V--)i[V].id===p&&i.splice(V,1);w()},dispose(){if(!h){h=!0;for(let p of d.values())p.abort();d.clear();for(let p of r.values())p.state==="ready"&&c(p.resource);r.clear(),i.length=0,o.clear();for(let p of m.values())p.controller.abort();u.clear(),m.clear(),g.clear(),b.clear()}}}}var dr=.25;function Ne(e){return e.error===void 0?{state:e.state}:{state:e.state,error:e.error}}function rn(e){return!Number.isFinite(e)||e<0?0:e>1?1:e}function ji(e){return e instanceof Error&&e.message?e.message:String(e)}async function Wi(){let{adaptersFor:e}=await Promise.resolve().then(()=>(Gt(),Nn)),t=e(["tone"]),n=typeof navigator<"u"&&/Headless/i.test(navigator.userAgent);for(let r of t)n?await r.load():await r.unlock()}function zi(e){if(!e||typeof e!="object")return;let t=e.id;return typeof t=="string"&&t.length>0?t:void 0}function ur(e={}){let t=e.toneStart??Wi,n=!!e.reducedSensory,r=new Set,i=new Map,o=new Map,d=new Map,u=[],m={state:"locked"},g,b=!1,h=!1;function A(w){for(let v of u.slice())v(w)}function F(w,v){let s=i.get(w);if(s)return v&&!s.participantId&&(s.participantId=v),s;let c={id:w,participantId:v,gain:1,muted:!1,duckGain:1,priority:0,manualDuck:!1};return i.set(w,c),c}function R(w){return b||w.muted?0:rn(w.gain*w.duckGain)}function S(w){return{id:w.id,participantId:w.participantId,gain:w.gain,muted:w.muted,duckGain:w.duckGain,priority:w.priority,effectiveGain:R(w)}}function L(){let w=-1/0;for(let v of d.values())v.priority>w&&(w=v.priority);for(let v of i.values())if(!v.manualDuck){if(w===-1/0){v.duckGain=1;continue}v.duckGain=v.priority<w?dr:1}}async function _(){if(h||m.state==="unlocked")return Ne(m);if(g)return await g,Ne(m);m={state:"unlocking"},g=(async()=>{try{await t(),m={state:"unlocked"}}catch(w){m={state:"failed",error:ji(w)}}})();try{await g}finally{g=void 0}return Ne(m)}return{unlock:_,status(){return Ne(m)},authorize(w){h||typeof w!="string"||w.length===0||r.add(w)},revoke(w){h||r.delete(w)},isAuthorized(w){return w===void 0||w.length===0?r.size===0:r.size===0?!0:r.has(w)},setChannelGain(w,v,s){h||typeof w!="string"||w.length===0||(F(w,s).gain=rn(v))},setPriority(w,v,s){h||typeof w!="string"||w.length===0||(F(w,s).priority=Number.isFinite(v)?v:0,L())},mute(){h||(b=!0,A({type:"mute"}))},unmute(){h||(b=!1,A({type:"mute"}))},muteChannel(w,v){h||typeof w!="string"||w.length===0||(F(w,v).muted=!0,A({type:"mute"}))},unmuteChannel(w){if(h)return;let v=i.get(w);v&&(v.muted=!1,A({type:"mute"}))},duck(w,v=dr){if(h||typeof w!="string"||w.length===0)return;let s=F(w);s.manualDuck=!0,s.duckGain=rn(v)},unduck(w){if(h)return;let v=i.get(w);v&&(v.manualDuck=!1,L())},effectiveGain(w){let v=i.get(w);return v?R(v):b?0:1},handleHostEvent(w){if(h||!w||typeof w!="object")return;let v=zi(w.payload);if(v){if(w.type===Ae){o.set(v,"ready"),A({type:"asset",id:v,status:"ready"});return}w.type===Ce&&(o.set(v,"failed"),A({type:"asset",id:v,status:"failed"}))}},assetStatus(w){return o.get(w)},noteCueStarted(w){if(h)return;d.set(w.idempotencyKey,{idempotencyKey:w.idempotencyKey,channelId:w.channelId,participantId:w.participantId,priority:w.priority});let v=F(w.channelId,w.participantId);w.priority>v.priority&&(v.priority=w.priority),L()},noteCueEnded(w){d.delete(w)&&L()},teardown(w){if(!h&&!(typeof w!="string"||w.length===0)){r.delete(w);for(let[v,s]of[...d.entries()])s.participantId===w&&d.delete(v);for(let[v,s]of[...i.entries()])s.participantId===w&&i.delete(v);L(),A({type:"teardown",participantId:w})}},onNotice(w){return u.push(w),()=>{let v=u.indexOf(w);v>=0&&u.splice(v,1)}},inspect(){let w=[...o.entries()].sort(([s],[c])=>s<c?-1:s>c?1:0),v={};for(let[s,c]of w)v[s]=c;return{status:Ne(m),reducedSensory:n,muted:b,authorized:[...r].sort(),channels:[...i.values()].sort((s,c)=>s.id<c.id?-1:s.id>c.id?1:0).map(S),assets:v}},destroy(){h||(h=!0,d.clear(),i.clear(),r.clear(),A({type:"destroy"}),u.length=0)},get reducedSensory(){return n},get muted(){return b}}}function cr(e,t){let n=e.dispatch.bind(e);e.dispatch=r=>{t.handleHostEvent(r),n(r)}}function Ct(e){wn();let{container:t,seed:n,captureKeyboard:r=!1,audio:i,deterministic:o,assets:d,audioBroker:u,audioParticipantId:m,kind:g="render",onFrameTiming:b}=e,h=n===void 0?void 0:Ln(n,o?"deterministic":"live"),A=new yt;if(u&&(cr(A,u),m&&u.authorize(m)),d&&typeof d.resolver?.resolve!="function")throw new Error("createRuntime: assets.resolver is required");let F=d?sr({resolver:d.resolver,timeoutMs:d.timeoutMs,emitEvents:d.emitEvents??!o,wallClockTimeout:!o,dispatch:Y=>A.dispatch(Y)}):void 0,R=!1,S=null,L,_=b,K=!1,w=t.clientWidth||window.innerWidth,v=t.clientHeight||window.innerHeight,s=new gt(30,!1,w,v,!1,void 0,{container:t,seed:h,captureKeyboard:r,hostChannel:A,audio:i,deterministic:o,kind:g,onFrameTiming:b}),c=()=>{let Y=t.clientWidth||window.innerWidth,q=t.clientHeight||window.innerHeight;return Y===s.containerWidth&&q===s.containerHeight?!1:(s.containerWidth=Y,s.containerHeight=q,!0)},I=null;return!s.isDeterministic&&typeof ResizeObserver<"u"&&(I=new ResizeObserver(()=>{if(R||!S)return;c()&&K&&s.reinit()}),I.observe(t)),s.onError=(Y,q)=>{L?.(Y,q)},{get tokenData(){return s.tokenData},get hostChannel(){return A},get assets(){return F},get audioBroker(){return u},get kind(){return g},get onError(){return L},set onError(Y){L=Y},get onFrameTiming(){return _},set onFrameTiming(Y){_=Y,s.onFrameTiming=Y},mount(Y,q={}){if(R)throw new Error("createRuntime: cannot mount on a destroyed runtime");S?.destroy(),K=!1,s.customState=q.initialState,s.setGameManager(q.gameManager);let J=q.onEvent?A.onEvent(q.onEvent):()=>{};if(u&&m&&u.authorize(m),!s.prepareCart(Y))throw J(),new Error("createRuntime: failed to prepare cart");let z=!1,p={async start(){if(!z){if(c()&&s.isPrepared&&(s.init(),s.unloadCart(),!s.prepareCart(Y)))throw new Error("createRuntime: failed to prepare cart");s.needsAudio&&(u?await u.unlock():await s.unlockAudio(),z)||(K=!0,s.beginPlayback())}},pause(){z||(s.paused=!0)},resume(){z||(s.paused=!1)},dispatch(D){z||A.dispatch(D)},snapshot(){if(z)return{seed:"",pngDataUrl:""};let D=s.canvas;return{seed:s.tokenData.hash,metadata:Y.metadata,pngDataUrl:D?D.toDataURL("image/png"):""}},destroy(){z||(z=!0,K=!1,J(),A.clearInbound(),s.unloadCart(),S===p&&(S=null))},reload(){if(!z){if(!K){if(s.isPrepared&&(s.unloadCart(),!s.prepareCart(Y)))throw new Error("createRuntime: failed to prepare cart");return}s.reloadCart()}},reinit(D){if(!z){if(!K){c();return}s.reinit(D)}},getCartState(){return s.animation?.cartState},exportState(){return z?Promise.reject(new Error("Cart handle has been destroyed")):s.exportState()},exportStateJSON(){return z?Promise.reject(new Error("Cart handle has been destroyed")):s.exportStateJSON()},async importState(D,V){if(z)throw new Error("Cart handle has been destroyed");let X=D,l=D;if(typeof D=="string")try{l=JSON.parse(D)}catch{await s.importState(D,V);return}if(l&&typeof l=="object"&&typeof l.schemaVersion=="number"){let y=tr(l);if(y.ok===!1)throw new de(Oe(y.errors));await s.importState(y.bundle,V);return}await s.importState(typeof X=="string"?X:l,V)},async exportSnapshot(D){if(z)throw new Error("Cart handle has been destroyed");let V=await s.exportState(),X=s.getClock(),l=At(V,{...D,rng:s.getRandomState(),clock:{framesElapsed:V.framesElapsed,elapsedSinceStart:V.elapsedSinceStart,now:X.now,frameRate:X.frameRate}});if(l.ok===!1)throw new de(Oe(l.errors));return l.snapshot},async exportSnapshotJSON(D){return JSON.stringify(await p.exportSnapshot(D))},async importSnapshot(D,V){if(z)throw new Error("Cart handle has been destroyed");let X=nr(D);if(X.ok===!1)throw new de(Oe(X.errors));await s.importState(X.snapshot.engineState,V)},peekExportedFramebuffer(){return z?null:s.peekExportedFramebuffer()},peekSeed(){if(!z)return s.peekSeed()},isGenerative(){return z?!1:s.isGenerative()},async step(D=1){if(z)throw new Error("Cart handle has been destroyed");await s.step(D)},async advance(D){if(z)throw new Error("Cart handle has been destroyed");await s.advance(D)},schedule(D){z||s.schedule(D)},getClock(){if(z)throw new Error("Cart handle has been destroyed");return s.getClock()},getRandomState(){if(z)throw new Error("Cart handle has been destroyed");return s.getRandomState()},getReplayMetadata(){return z?Promise.reject(new Error("Cart handle has been destroyed")):s.getReplayMetadata()},get canvas(){return s.canvas},get paused(){return s.paused},set paused(D){z||(s.paused=D)},get tokenData(){return s.tokenData},get isPrepared(){return s.isPrepared},get isLoopRunning(){return s.isLoopRunning},get needsAudio(){return s.needsAudio},get audioLibraries(){return s.audioLibraries}};return S=p,p},async unlockAudio(){if(u){s.needsAudio&&await u.unlock();return}await s.unlockAudio()},destroy(){R||(R=!0,S?.destroy(),S=null,u&&m&&u.teardown(m),I?.disconnect(),I=null,F?.dispose(),A.close(),s.destroy())}}}var lr="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",pr=320,mr=180,qi="Headless harness has been destroyed",fr=!1;function Et(e={}){if(e.glyphAtlas&&Vt(e.glyphAtlas),typeof globalThis.ImageData>"u"){class n{constructor(i,o,d){this.colorSpace="srgb";typeof i=="number"?(this.width=i,this.height=o??0,this.data=new Uint8ClampedArray(this.width*this.height*4)):(this.data=i,this.width=o??0,this.height=d??i.length/4/this.width)}}globalThis.ImageData=n}En();let t=HTMLCanvasElement.prototype;t.getContext=function(r,i){return String(r??"2d").toLowerCase()!=="2d"?null:Ht(this,{alpha:i?.alpha!==!1,glyphAtlas:e.glyphAtlas})},t.toDataURL=function(r){if(r&&r!=="image/png")throw new ne(`toDataURL(${r})`);return bn(this)??lr},fr=!0}function Yi(e,t){let n=document.createElement("div");return Object.defineProperty(n,"clientWidth",{value:e,configurable:!0}),Object.defineProperty(n,"clientHeight",{value:t,configurable:!0}),document.body.appendChild(n),n}function Ji(e){let t=e.indexOf(","),n=t>=0?e.slice(t+1):e,r=globalThis.atob(n),i=new Uint8Array(r.length);for(let o=0;o<r.length;o++)i[o]=r.charCodeAt(o);return i}function Xi(){return typeof process<"u"&&!!process.versions?.node}async function Qi(e,t){if(!Xi())throw new Error("captureFrame(path) requires Node.js; omit the path to get the snapshot only");let n;try{({writeFile:n}=await import("node:fs/promises"))}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`captureFrame(path) could not load node:fs/promises (${i}). Omit the path, or run under Node.`)}try{await n(e,Ji(t))}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`captureFrame could not write ${e}: ${i}`)}}function Zi(e){fr||Et();let t=e.width??pr,n=e.height??mr,r=Yi(t,n),i=[],o=[],d=!1,u=e.onEvent,m=e.onError,g=Ct({container:r,seed:e.seed,deterministic:{origin:e.origin,actions:e.actions??[]}});g.onError=(R,S)=>{o.push({error:R,info:S}),m?.(R,S)},Object.defineProperty(g,"onError",{configurable:!0,enumerable:!0,get(){return m},set(R){m=R}});let b=R=>{i.push(R),u?.(R)},h=g.mount(e.cart,{initialState:e.initialState,gameManager:e.gameManager,onEvent:b}),A=()=>{if(d)throw new Error(qi)};return{runtime:g,container:r,get events(){return i.slice()},get errors(){return o.slice()},get cart(){return h},async step(R=1){A(),await h.step(R)},async advance(R){A(),await h.advance(R)},schedule(R){A(),h.schedule(R)},dispatch(R){A(),h.dispatch(R)},start(){return A(),h.start()},pause(){A(),h.pause()},resume(){A(),h.resume()},get paused(){return h.paused},key(R){A(),h.schedule({type:"key",atFrame:h.getClock().framesElapsed,key:R})},click(R,S){A(),h.schedule({type:"pointer",atFrame:h.getClock().framesElapsed,pointer:{kind:"down",x:R,y:S}})},async inspect(){A();let R=await h.getReplayMetadata();return{state:R.state,events:i.slice(),errors:o.slice(),replay:R,clock:h.getClock()}},async captureFrame(R){A();let S=h.snapshot();return R&&await Qi(R,S.pngDataUrl),S},remount(R={}){return A(),i.length=0,o.length=0,"onEvent"in R&&(u=R.onEvent),h=g.mount(e.cart,{initialState:R.initialState??e.initialState,gameManager:R.gameManager??e.gameManager,onEvent:b}),h},destroy(){if(!d){d=!0;try{h.destroy()}finally{try{g.destroy()}finally{r.remove()}}}}}}var hr="CYBERART_UPDATE_GOLDEN";function gr(e=typeof process<"u"?process.env:void 0){let t=e?.[hr];return t==="1"||t==="true"}function on(e){return Ot(ot(e))}function yr(e,t,n={}){if(e.width!==t.width||e.height!==t.height){let b=to(e,t);return{match:!1,differingPixels:e.width*e.height,width:e.width,height:e.height,artifacts:b,updatedGolden:!1}}let r=n.tolerance??0,i=n.perceptualThreshold,o=n.maxDifferingPixels??0,d=new Uint8ClampedArray(e.width*e.height*4),u=0;for(let b=0;b<e.data.length;b+=4){let h=Math.abs(e.data[b]-t.data[b]),A=Math.abs(e.data[b+1]-t.data[b+1]),F=Math.abs(e.data[b+2]-t.data[b+2]),R=Math.abs(e.data[b+3]-t.data[b+3]),S=.299*h+.587*A+.114*F,L=n.alphaTolerance??r;(i!==void 0?S<=i&&R<=L:h<=r&&A<=r&&F<=r&&R<=L)?(d[b]=0,d[b+1]=0,d[b+2]=0,d[b+3]=255):(u+=1,d[b]=255,d[b+1]=0,d[b+2]=255,d[b+3]=255)}let m=an(t,e,Se(d,e.width,e.height),u);return n.updateGolden===!0||gr()?{match:!0,differingPixels:0,width:e.width,height:e.height,artifacts:an(e,e,Se(d,e.width,e.height),0),updatedGolden:!0}:{match:u<=o,differingPixels:u,width:e.width,height:e.height,artifacts:m,updatedGolden:!1}}function br(e,t,n={}){let r=yr(e,t,n);if(!r.match){let i=new Error(`Visual assertion failed: ${r.differingPixels} differing pixels (${r.width}\xD7${r.height}). Review expected/actual/diff PNG buffers on the result.`);throw i.visual=r,i}return r}function eo(e,t,n={}){return br(on(e),on(t),n)}function an(e,t,n,r){let i=Pe(e.width,e.height,e.data),o=Pe(t.width,t.height,t.data),d=Pe(n.width,n.height,n.data);return{expectedPng:i,actualPng:o,diffPng:d,expectedDataUrl:De(e.width,e.height,e.data),actualDataUrl:De(t.width,t.height,t.data),diffDataUrl:De(n.width,n.height,n.data),differingPixels:r}}function to(e,t){let n=Math.max(e.width,t.width),r=Math.max(e.height,t.height),i=new Uint8ClampedArray(n*r*4);for(let o=0;o<i.length;o+=4)i[o]=255,i[o+1]=0,i[o+2]=255,i[o+3]=255;return an(t,e,Se(i,n,r),n*r)}async function no(e,t,n={}){let{mkdir:r,writeFile:i}=await import("node:fs/promises"),{join:o}=await import("path");await r(e,{recursive:!0});let d=o(e,n.expected??"expected.png"),u=o(e,n.actual??"actual.png"),m=o(e,n.diff??"diff.png");return await i(d,t.expectedPng),await i(u,t.actualPng),await i(m,t.diffPng),{expectedPath:d,actualPath:u,diffPath:m}}var vr="cyberart.state.save",Sr="cyberart.state.load";var wt=1,Qe="cyberart.diagnostic.rejected",sn=8,ro=new Set(["intent","state","diagnostic"]),io=new Set([vr,Sr]);function Ar(e){return typeof e=="string"&&ro.has(e)}function oo(e){if(e.kind!==void 0)return Ar(e.kind)?e.kind:void 0;if(!(typeof e.type!="string"||e.type.length===0)){if(io.has(e.type))return"intent";for(let t of e.type.split("."))if(Ar(t))return t}}function ao(e,t){let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function Ke(e,t){for(let n of e)if(ao(n,t))return!0;return!1}function so(e){if(e===void 0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(JSON.stringify(e))}}catch{return{ok:!1}}}function dn(e,t){if(!e||typeof e.type!="string"||e.type.length===0)return{ok:!1,reason:"malformed",detail:"type is required"};if(e.schemaVersion!==void 0&&e.schemaVersion!==wt)return{ok:!1,reason:"malformed",detail:`unsupported schemaVersion ${String(e.schemaVersion)}`};let n=oo(e);if(!n)return{ok:!1,reason:"malformed",detail:`cannot infer kind from type "${e.type}"`};let r=so(e.payload);if(!r.ok)return{ok:!1,reason:"malformed",detail:"payload is not JSON-serializable"};let i=t.createId(),o=typeof e.correlationId=="string"&&e.correlationId.length>0?e.correlationId:i,d=typeof e.causationId=="string"&&e.causationId.length>0?e.causationId:t.causationId,u=typeof e.target=="string"&&e.target.length>0?e.target:void 0,m=t.maxHops??sn,g=t.parentHops===void 0?m:Math.max(0,t.parentHops-1),b=typeof e.idempotencyKey=="string"&&e.idempotencyKey.length>0?e.idempotencyKey:void 0,h={schemaVersion:wt,type:e.type,kind:n,source:t.source,id:i,correlationId:o,seq:t.seq,hops:g};return u&&(h.target=u),d&&(h.causationId=d),b&&(h.idempotencyKey=b),r.value!==void 0&&(h.payload=r.value),{ok:!0,envelope:h}}var uo=new Set(["rate-limited","storm-detected","hop-limit","loop-detected","not-subscribed"]),co=8,lo=8,po=16,mo=256,fo=256,ho=["*.intent.*"];function Cr(e={}){let t=e.hostSource??"host",n="router",r=e.maxPerTurn??co,i=e.maxCausationDepth??lo,o=e.maxHops??sn,d=e.maxCorrelationPerTurn??po,u=e.maxIndex??mo,m=e.maxDecisions??fo,g=e.maxPerWindow,b=e.windowMs??1e3,h=e.now??Date.now,A=0,F=e.createId??(()=>`evt-${++A}`),R=new Map,S=[],L=[],_=new Map,K=new Map,w=new Map,v=[],s=0,c=0,I=0;function j(f){try{return JSON.parse(JSON.stringify(f))}catch{return f}}function Y(f){for(v.push(f);v.length>m;)v.shift();for(let x of L)try{x(j(f))}catch{}}function q(f,x){let O={outcome:x.outcome,source:x.source,type:f.type,kind:f.kind,envelopeId:f.id,deliveredTo:x.deliveredTo,hops:f.hops,seq:f.seq,correlationId:f.correlationId,schemaVersion:f.schemaVersion,turn:I,time:h()};return x.reason&&(O.reason=x.reason),x.detail&&(O.detail=x.detail),x.priorEnvelopeId&&(O.priorEnvelopeId=x.priorEnvelopeId),f.target&&(O.target=f.target),f.causationId&&(O.causationId=f.causationId),f.idempotencyKey&&(O.idempotencyKey=f.idempotencyKey),f.payload!==void 0&&(O.payload=j(f.payload)),O}let J=[],z=!1;function p(f,x,O){for(f.set(x,O);f.size>u;){let $=f.keys().next().value;if($===void 0)break;f.delete($)}}function D(f){p(_,f.id,{type:f.type,source:f.source,causationId:f.causationId,hops:f.hops,correlationId:f.correlationId,idempotencyKey:f.idempotencyKey})}function V(f,x){x&&(f.correlationId||(f.correlationId=x.correlationId),f.causationId||(f.causationId=x.id),!f.idempotencyKey&&x.idempotencyKey&&(f.idempotencyKey=`${x.idempotencyKey}::${f.type}`))}function X(f,x){if(f){let O=_.get(f);return O?O.hops:o}return x}function l(f,x){return`${f}\0${x}`}function y(f,x){f.idempotencyKey&&p(w,l(f.source,f.idempotencyKey),x)}function k(f,x){if(x)return w.get(l(f,x))}function T(f){return k(f.source,f.idempotencyKey)}function P(f){return f.seq+=1,f.seq}function H(f,x){if(!(typeof x.causationId=="string"&&x.causationId.length>0))return f.lastDelivered}function U(f){let x=new Set,O=new Set([`${f.type}\0${f.source}`]),$=f.causationId,G=0;for(;$;){if(G+=1,G>i||x.has($))return!0;x.add($);let ee=_.get($);if(!ee)break;let le=`${ee.type}\0${ee.source}`;if(O.has(le))return!0;O.add(le),$=ee.causationId}return!1}function B(f){let x=(K.get(f)??0)+1;return K.set(f,x),x}function a(f,x){g!==void 0&&(f.emitTimestamps=f.emitTimestamps.filter(O=>x-O<b))}function C(f,x){return(x.kind==="state"||x.kind==="diagnostic")&&!f.authoritative?!1:Ke(f.emit,x.type)}function E(f){for(let x of S)if(Ke(x.patterns,f.type))try{x.listener(f)}catch{}}function M(f){let x=[];if(f.target){let O=R.get(f.target);return!O||!Ke(O.subscribe,f.type)||(O.channel.dispatch(f),O.lastDelivered={id:f.id,hops:f.hops,correlationId:f.correlationId,idempotencyKey:f.idempotencyKey},x.push(O.id)),x}for(let O of R.values())Ke(O.subscribe,f.type)&&(O.channel.dispatch(f),O.lastDelivered={id:f.id,hops:f.hops,correlationId:f.correlationId,idempotencyKey:f.idempotencyKey},x.push(O.id));return x}function N(f,x,O,$,G,ee,le){let ae={reason:$,eventType:x,source:O};G&&(ae.detail=G),c+=1;let he=F(),we={schemaVersion:wt,type:Qe,kind:"diagnostic",source:n,id:he,correlationId:ee??he,seq:c,hops:0,payload:ae};le&&(we.causationId=le),D(we);let tt=R.get(f);tt&&tt.channel.dispatch(we),E(we)}function Q(f,x,O,$,G){if(N(f,G?.type??(typeof x.type=="string"?x.type:""),G?.source??f,O,$,G?.correlationId,G?.id),G?.idempotencyKey&&!uo.has(O)&&y(G,{status:"rejected"}),G)Y(q(G,{outcome:"rejected",reason:O,detail:$,source:f,deliveredTo:[]}));else{let ee={outcome:"rejected",reason:O,source:f,type:typeof x.type=="string"?x.type:"",deliveredTo:[],turn:I,time:h()};$&&(ee.detail=$),typeof x.idempotencyKey=="string"&&(ee.idempotencyKey=x.idempotencyKey),Y(ee)}}function Z(f,x){D(f),y(f,{status:"accepted",envelope:f}),B(f.correlationId),E(f);let O=M(f);Y(q(f,{outcome:"accepted",source:x,deliveredTo:O}))}function W(f,x,O,$){let G=$?.type??(typeof x.type=="string"?x.type:""),ee={outcome:"duplicate",reason:"duplicate",detail:O.status==="accepted"?"idempotent accepted":"idempotent rejected",source:f,type:G,deliveredTo:[],turn:I,time:h()};$?(ee.kind=$.kind,ee.envelopeId=$.id,ee.hops=$.hops,ee.seq=$.seq,ee.correlationId=$.correlationId,ee.schemaVersion=$.schemaVersion,$.target&&(ee.target=$.target),$.causationId&&(ee.causationId=$.causationId),$.idempotencyKey&&(ee.idempotencyKey=$.idempotencyKey),$.payload!==void 0&&(ee.payload=j($.payload))):typeof x.idempotencyKey=="string"&&(ee.idempotencyKey=x.idempotencyKey),O.status==="accepted"&&(ee.priorEnvelopeId=O.envelope.id,ee.envelopeId||(ee.envelopeId=O.envelope.id)),Y(ee)}function te(f,x,O,$){if(!O.ok){Q(f,x,"malformed",O.detail);return}let G=O.envelope,ee=T(G);if(ee)return W(f,x,ee,G),ee.status==="accepted"?ee.envelope:void 0;if(G.hops<1){Q(f,x,"hop-limit","no hops remaining",G);return}if(G.target&&G.target!==t){let le=R.get(G.target);if(!le){Q(f,x,"unknown-target",`unknown target "${G.target}"`,G);return}if(!Ke(le.subscribe,G.type)){Q(f,x,"not-subscribed",`target "${G.target}" does not subscribe to ${G.type}`,G);return}}if($){if(!C($,G)){Q(f,x,"unauthorized","source may not emit this event",G);return}if($.emitsThisTurn+=1,$.emitsThisTurn>r){Q(f,x,"rate-limited","maxPerTurn exceeded",G);return}if(g!==void 0){let ae=h();if(a($,ae),$.emitTimestamps.push(ae),$.emitTimestamps.length>g){Q(f,x,"rate-limited","maxPerWindow exceeded",G);return}}if(U(G)){Q(f,x,"loop-detected","causation chain cycle or depth exceeded",G);return}if((K.get(G.correlationId)??0)+1>d){Q(f,x,"storm-detected","correlationId storm",G);return}if(e.validate){let ae;try{ae=e.validate(G)}catch(he){let we=he instanceof Error?he.message:"validate threw";Q(f,x,"host-rejected",we,G);return}if(ae!==!0){Q(f,x,"host-rejected",ae.detail,G);return}}}else{if(U(G)){Q(f,x,"loop-detected","causation chain cycle or depth exceeded",G);return}if((K.get(G.correlationId)??0)+1>d){Q(f,x,"storm-detected","correlationId storm",G);return}}return Z(G,f),G}function ie(f,x){let O=R.get(f);if(!O)return;let $={...x},G=H(O,$);V($,G);let ee=k(O.id,$.idempotencyKey);if(ee){W(f,$,ee);return}let le=P(O),ae=dn($,{source:O.id,createId:F,seq:le,causationId:G?.id,maxHops:o,parentHops:X($.causationId??G?.id,G?.hops)});te(f,$,ae,O)}function ve(f,x){let O=x?.cause,$={...f};V($,O);let G=k(t,$.idempotencyKey);if(G)return W(t,$,G),G.status==="accepted"?G.envelope:void 0;s+=1;let ee=dn($,{source:t,createId:F,seq:s,causationId:$.causationId,maxHops:o,parentHops:X($.causationId,O?.hops)});return te(t,$,ee,void 0)}function xe(){if(!z){z=!0;try{for(;J.length>0;){let f=J.shift();f&&(f.kind==="cart"?ie(f.participantId,f.event):f.result=ve(f.event,f.extras))}}finally{z=!1}}}function Ee(f){J.push(f),xe()}return{attach(f,x,O={}){if(f===t||f===n)throw new Error(`createEventRouter: "${f}" is a reserved participant id`);for(let ee of R.values())if(ee.channel===x&&ee.id!==f)throw new Error(`createEventRouter: channel already attached as "${ee.id}"`);R.get(f)?.unsubscribe();let G={id:f,channel:x,emit:O.emit??ho,subscribe:O.subscribe??[],authoritative:O.authoritative===!0,seq:0,emitsThisTurn:0,emitTimestamps:[],unsubscribe:()=>{}};G.unsubscribe=x.onEvent(ee=>{Ee({kind:"cart",participantId:f,event:ee})}),R.set(f,G)},detach(f){let x=R.get(f);x&&(x.unsubscribe(),R.delete(f))},publish(f,x){let O={kind:"publish",event:f,extras:x};return Ee(O),O.result},subscribe(f,x){let O={patterns:f,listener:x};return S.push(O),()=>{let $=S.indexOf(O);$>=0&&S.splice($,1)}},subscribeDecision(f){return L.push(f),()=>{let x=L.indexOf(f);x>=0&&L.splice(x,1)}},inspectParticipants(){return[...R.values()].map(f=>({id:f.id,emit:f.emit.slice(),subscribe:f.subscribe.slice(),authoritative:f.authoritative}))},inspectDecisions(){return v.map(f=>j(f))},turn(){I+=1,K.clear();for(let f of R.values())f.emitsThisTurn=0,f.lastDelivered=void 0,g!==void 0&&a(f,h())}}}var go=320,yo=180,bo=1024,vo="Runtime group has been destroyed";function So(e){let t="";for(let n=0;n<32;n++){let r=e.charCodeAt(n%Math.max(e.length,1))+n*17&255;t+=r.toString(16).padStart(2,"0")}return`0x${t}`}function Ao(e,t){let n=document.createElement("div");return Object.defineProperty(n,"clientWidth",{value:e,configurable:!0}),Object.defineProperty(n,"clientHeight",{value:t,configurable:!0}),document.body.appendChild(n),n}function wr(e){let t=e.capability,n={},r=e.emit??t?.emit,i=e.subscribe??t?.subscribe,o=e.authoritative??t?.authoritative;return r&&(n.emit=r),i&&(n.subscribe=i),o!==void 0&&(n.authoritative=o),n}function Er(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Co(e){let t=new Set([Qe,"*.*","*.*.*","*.*.*.*","*.*.*.*.*"]);for(let n of e){let r=wr(n);for(let i of r.emit??[])t.add(i);for(let i of r.subscribe??[])t.add(i)}return[...t]}function kr(e){if(!e.participants.length)throw new Error("createRuntimeGroup: at least one participant is required");let t=new Set;for(let c of e.participants){if(!c.id)throw new Error("createRuntimeGroup: participant id is required");if(t.has(c.id))throw new Error(`createRuntimeGroup: duplicate participant id "${c.id}"`);t.add(c.id)}let n=e.origin??0,r=e.width??go,i=e.height??yo,o=e.maxTrace??bo,d=[...e.participants].sort((c,I)=>c.id.localeCompare(I.id)),u=[],m=new Map,g=0,b=e.createId??e.router?.createId??(()=>`evt-${++g}`),h=e.now??e.router?.now??(()=>{let c=u[0];if(!c)return n;try{return c.cart.getClock().now}catch{return n}}),A=Cr({...e.router,createId:b,now:h,validate:e.validate??e.router?.validate}),F=[],R=!1,S=!1,L=()=>{},_=c=>I=>{c.events.push(I),c.userOnEvent?.(I)},K=()=>{if(S)throw new Error(vo)},w=()=>{L();for(let c of u){try{A.detach(c.id)}catch{}try{c.runtime.destroy()}catch{}c.ownsContainer&&c.container.remove()}u.length=0,m.clear()};try{for(let c of d){let I=c.width??r,j=c.height??i,Y=!c.container,q=c.container??Ao(I,j),J=Ct({container:q,seed:c.seed??So(c.id),deterministic:{origin:n},audioBroker:e.audioBroker,audioParticipantId:e.audioBroker?c.id:void 0,kind:c.kind??"render"}),z={id:c.id,kind:c.kind??"render",cartDef:c.cart,initialState:c.initialState,gameManager:c.gameManager,userOnEvent:c.onEvent,runtime:J,container:q,ownsContainer:Y,cart:void 0,events:[],errors:[]};J.onError=(p,D)=>{z.errors.push({error:p,info:D})},A.attach(c.id,J.hostChannel,wr(c)),z.cart=J.mount(c.cart,{initialState:c.initialState,gameManager:c.gameManager,onEvent:_(z)}),u.push(z),m.set(z.id,z)}L=A.subscribe(Co(d),c=>{for(F.push(Er(c));F.length>o;)F.shift()})}catch(c){throw w(),c}let v=c=>({id:c.id,kind:c.kind,runtime:c.runtime,container:c.container,get events(){return c.events.slice()},get errors(){return c.errors.slice()},get cart(){return c.cart}});return{router:A,origin:n,get paused(){return R},get audioBroker(){return e.audioBroker},participant(c){K();let I=m.get(c);if(!I)throw new Error(`createRuntimeGroup: unknown participant "${c}"`);return v(I)},async step(c=1){if(K(),R)return;let I=Math.max(0,Math.floor(c));for(let j=0;j<I;j++){A.turn();for(let Y of u)try{await Y.cart.step(1)}catch(q){Y.errors.push({error:q,info:{phase:"update",consecutive:Y.errors.length+1,stopped:!1}})}}},pause(){K(),R=!0;for(let c of u)c.cart.pause()},resume(){K(),R=!1;for(let c of u)c.cart.resume()},reset(){K(),F.length=0;for(let c of u)c.events.length=0,c.errors.length=0,c.cart=c.runtime.mount(c.cartDef,{initialState:c.initialState,gameManager:c.gameManager,onEvent:_(c)});A.turn()},resize(c,I){K();let j=Math.max(1,c|0),Y=Math.max(1,I|0);for(let q of u){Object.defineProperty(q.container,"clientWidth",{value:j,configurable:!0}),Object.defineProperty(q.container,"clientHeight",{value:Y,configurable:!0});let J=q.cart.canvas;J&&(J.width=j,J.height=Y)}},detach(c){K();let I=m.get(c);if(!I)throw new Error(`createRuntimeGroup: unknown participant "${c}"`);try{A.detach(I.id)}catch{}try{I.runtime.destroy()}catch{}e.audioBroker&&e.audioBroker.teardown(I.id),I.ownsContainer&&I.container.remove();let j=u.indexOf(I);j>=0&&u.splice(j,1),m.delete(c)},dispatch(c,I){K();let j=m.get(c);if(!j)throw new Error(`createRuntimeGroup: unknown participant "${c}"`);j.cart.dispatch(I)},publish(c,I){return K(),A.publish(c,I)},inspectParticipants(){K();let c=new Map(u.map(I=>[I.id,I.kind]));return A.inspectParticipants().map(I=>({...I,kind:c.get(I.id)??"render"}))},async inspect(){K();let c={},I={},j=new Map(A.inspectParticipants().map(q=>[q.id,q]));for(let q of u){let J=await q.cart.getReplayMetadata(),z=q.cart.getClock();I[q.id]=z;let p=j.get(q.id);c[q.id]={state:J.state,events:q.events.slice(),errors:q.errors.slice(),kind:q.kind,clock:z,emit:p?.emit.slice()??[],subscribe:p?.subscribe.slice()??[],authoritative:p?.authoritative===!0}}let Y=F.map(q=>Er(q));return{participants:c,trace:Y,diagnostics:{paused:R,participantIds:u.map(q=>q.id),clocks:I,rejections:Y.filter(q=>q.type===Qe).map(q=>q.payload)}}},destroy(){if(!S){S=!0,R=!1;try{w()}finally{F.length=0}}}}}function Eo(e){return Et(),kr(e)}var un=1,wo=512,ko="[REDACTED]",Ro=new Set([Ae,Ce]);function ce(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function kt(e,t){if(e==null)return e;if(Array.isArray(e))return e.map(i=>kt(i,t));if(typeof e!="object")return e;let n=e,r={};for(let[i,o]of Object.entries(n))r[i]=t.has(i)?ko:kt(o,t);return r}function xo(e){return e instanceof Error&&typeof e.message=="string"?e.message:"error"}function Io(e,t){return t?!(t.types&&!t.types.includes(e.type)||t.sources&&!t.sources.includes(e.source)||t.outcomes&&!t.outcomes.includes(e.outcome)||t.correlationId&&e.correlationId!==t.correlationId):!0}function Rr(e){return JSON.stringify({outcome:e.outcome,reason:e.reason,source:e.source,target:e.target,type:e.type,kind:e.kind,envelopeId:e.envelopeId,priorEnvelopeId:e.priorEnvelopeId,correlationId:e.correlationId,causationId:e.causationId,hops:e.hops,seq:e.seq,idempotencyKey:e.idempotencyKey,deliveredTo:e.deliveredTo,payload:e.payload})}function To(e,t){if(e.length!==t.length)return{ok:!1,detail:`record count ${t.length} !== ${e.length}`};for(let n=0;n<e.length;n++){let r=Rr(e[n]),i=Rr(t[n]);if(r!==i)return{ok:!1,detail:`record ${n} differs`}}return{ok:!0}}function xr(e){let t=new Map,n=[];for(let o of e){if(o.outcome==="duplicate"){n.push(void 0);continue}let d={envelopeId:o.envelopeId,type:o.type,source:o.source,outcome:o.outcome,children:[]};o.reason&&(d.reason=o.reason),n.push(d),o.envelopeId&&!t.has(o.envelopeId)&&t.set(o.envelopeId,d)}let r=new Set;for(let o=0;o<e.length;o++){let d=e[o],u=n[o];if(!u)continue;let m=d.causationId?t.get(d.causationId):void 0;m&&m!==u&&(m.children.push(u),r.add(u))}let i=[];for(let o of n)o&&!r.has(o)&&i.push(o);return i}function Ir(e,t){let n={id:e.id,emit:e.emit.slice(),subscribe:e.subscribe.slice(),authoritative:e.authoritative,errorCount:0};return t&&(n.kind=t),n}function Po(e,t,n){let r=t.errors[t.errors.length-1],i={id:e,kind:t.kind,emit:t.emit.slice(),subscribe:t.subscribe.slice(),authoritative:t.authoritative,clock:ce(t.clock),state:kt(t.state,n),errorCount:t.errors.length};return r&&(i.lastError=xo(r.error)),i}function Tr(e={}){let t=new Set(e.redactedKeys??[]),n=e.maxRecords??wo,r=e.registry,i=0,o=0,d=!1,u=[],m=[],g,b=[],h=0,A=[],F={},R=()=>{},S=()=>{if(d)throw new Error("Replay inspector has been destroyed")},L=v=>{let s=r?.get(v.type),c={index:o,turn:v.turn,time:v.time,outcome:v.outcome,source:v.source,type:v.type,deliveredTo:v.deliveredTo.slice(),payload:kt(v.payload,t)};for(o+=1,v.reason&&(c.reason=v.reason),v.detail&&(c.detail=v.detail),v.target&&(c.target=v.target),v.kind&&(c.kind=v.kind),v.envelopeId&&(c.envelopeId=v.envelopeId),v.priorEnvelopeId&&(c.priorEnvelopeId=v.priorEnvelopeId),v.correlationId&&(c.correlationId=v.correlationId),v.causationId&&(c.causationId=v.causationId),v.hops!==void 0&&(c.hops=v.hops),v.seq!==void 0&&(c.seq=v.seq),v.idempotencyKey&&(c.idempotencyKey=v.idempotencyKey),v.schemaVersion!==void 0&&(c.schemaVersion=v.schemaVersion),s&&(c.payloadSchemaVersion=s.payloadSchema.version),u.push(c);u.length>n;)u.shift(),i+=1},_=v=>u.filter(s=>Io(s,v)).map(s=>ce(s)),K=v=>v?v.inspectParticipants().map(s=>Ir(s,s.kind)):A.map(s=>ce(s)),w={watchRouter(v){if(S(),R(),A=v.inspectParticipants().map(c=>Ir(c)),u.length===0)for(let c of v.inspectDecisions())L(c);let s=v.subscribeDecision(c=>L(c));return R=()=>{s(),R=()=>{}},m.push(R),R},bind(v){S(),g&&R(),g=v,h=v.origin,w.watchRouter(v.router),A=K(v);let s={publish(c,I){S();let j={kind:"publish",event:ce(c)};return I?.cause&&(j.extras={cause:ce(I.cause)}),b.push(j),v.publish(c,I)},dispatch(c,I){S();let j=ce(I);typeof j.type=="string"&&Ro.has(j.type)?b.push({kind:"asset",participantId:c,event:j}):b.push({kind:"dispatch",participantId:c,event:j}),v.dispatch(c,I)},async step(c=1){S(),b.push({kind:"step",frames:c}),await v.step(c)},async report(){S();let c=await v.inspect(),I=[];for(let j of Object.keys(c.participants).sort())I.push(Po(j,c.participants[j],t));A=I,F={};for(let j of I)F[j.id]=ce(j.state);return w.report()},async exportTrace(c){return await s.report(),w.exportTrace(c)},unbind(){R(),g=void 0}};return s},importTrace(v){S();let s=typeof v=="string"?JSON.parse(v):v;if(s.schemaVersion!==un)throw new Error("Replay inspector: unsupported export schemaVersion");i=0,o=0,u.length=0,b=ce(s.tape??[]),h=s.origin??0,A=ce(s.participants??[]),F=ce(s.snapshots??{});for(let c of s.records??[])L({outcome:c.outcome,reason:c.reason,detail:c.detail,source:c.source,type:c.type,kind:c.kind,envelopeId:c.envelopeId,priorEnvelopeId:c.priorEnvelopeId,target:c.target,deliveredTo:c.deliveredTo,hops:c.hops,seq:c.seq,correlationId:c.correlationId,causationId:c.causationId,idempotencyKey:c.idempotencyKey,schemaVersion:c.schemaVersion,payload:c.payload,turn:c.turn,time:c.time})},exportTrace(v){return S(),{schemaVersion:un,origin:h,redactedKeys:[...t],participants:ce(A),tape:ce(b),records:_(v),snapshots:ce(F)}},report(v){S();let s=_(v);return{schemaVersion:un,participants:ce(A),records:s,trees:xr(s),dropped:i}},causationTree(v){S();let s=_(v?{correlationId:v}:void 0);return xr(s)},records(){return S(),u.map(v=>ce(v))},reset(){S(),u.length=0,b=[],i=0,o=0,F={},g&&(A=K(g))},destroy(){if(!d){for(d=!0,R();m.length>0;)m.pop()?.();u.length=0,b=[],A=[],F={},g=void 0}}};return w}async function Do(e,t,n={}){let r=Tr({redactedKeys:n.redactedKeys??e.redactedKeys,maxRecords:n.maxRecords,registry:n.registry}),i=r.bind(t);try{for(let d of e.tape)d.kind==="publish"?i.publish(d.event,d.extras):d.kind==="dispatch"||d.kind==="asset"?i.dispatch(d.participantId,d.event):await i.step(d.frames);let o=await i.report();return{inspector:r,report:o}}catch(o){throw r.destroy(),o}}var Ue="cue.started",Ze="cue.completed",Be="cue.cancelled",Ie="cue.replaced";function Mo(e,t){let n=e<0?0:e>1?1:e;return t==="ease-out"?1-(1-n)*(1-n):n}function Pr(e){return{type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,progress:e.progress}}function Rt(e){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:e.phase,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,progress:e.progress,repeatIndex:e.repeatIndex}}function cn(e){return e.startFrame+e.delayFrames}function Fo(e,t){if(!e||typeof e!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof e.name!="string"||e.name.length===0)return{ok:!1,reason:"invalid",detail:"name is required"};if(typeof e.idempotencyKey!="string"||e.idempotencyKey.length===0)return{ok:!1,reason:"invalid",detail:"idempotencyKey is required"};if(typeof e.durationFrames!="number"||!Number.isFinite(e.durationFrames)||e.durationFrames<0)return{ok:!1,reason:"invalid",detail:"durationFrames must be a non-negative finite number"};let n=e.startFrame===void 0?t:e.startFrame;if(typeof n!="number"||!Number.isFinite(n))return{ok:!1,reason:"invalid",detail:"startFrame must be finite"};let r=e.delayFrames??0;if(typeof r!="number"||!Number.isFinite(r)||r<0)return{ok:!1,reason:"invalid",detail:"delayFrames must be a non-negative finite number"};let i=e.easing??"linear";if(i!=="linear"&&i!=="ease-out")return{ok:!1,reason:"invalid",detail:"unsupported easing"};let o=e.onDuplicate??"replace";if(o!=="ignore"&&o!=="replace"&&o!=="reject")return{ok:!1,reason:"invalid",detail:"unsupported onDuplicate"};let d=0;if(e.repeat)if("forever"in e.repeat&&e.repeat.forever)d="forever";else if("count"in e.repeat){if(typeof e.repeat.count!="number"||!Number.isFinite(e.repeat.count)||e.repeat.count<0)return{ok:!1,reason:"invalid",detail:"repeat.count must be >= 0"};d=Math.floor(e.repeat.count)}else return{ok:!1,reason:"invalid",detail:"unsupported repeat"};let u=e.reducedMotion??"complete";return u!=="skip"&&u!=="complete"&&(typeof u!="object"||typeof u.durationFrames!="number"||!Number.isFinite(u.durationFrames)||u.durationFrames<0)?{ok:!1,reason:"invalid",detail:"unsupported reducedMotion"}:{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:n,durationFrames:e.durationFrames,delayFrames:r,easing:i,repeatRemaining:d,repeatIndex:0,reducedMotion:u,onDuplicate:o,phase:"scheduled",progress:0}}function Lo(e,t){if(!t)return e;let n=e.reducedMotion;return n==="skip"||n==="complete"?{...e,durationFrames:0,delayFrames:0,startFrame:e.startFrame}:{...e,durationFrames:n.durationFrames}}function et(e={}){let t=!!e.reducedMotion,n=e.originFrame??0,r=new Map,i=[];function o(S){i.push(S)}function d(S,L){let _=cn(S)-cn(L);return _!==0?_:S.name<L.name?-1:S.name>L.name?1:S.idempotencyKey<L.idempotencyKey?-1:S.idempotencyKey>L.idempotencyKey?1:0}function u(S,L){o({type:L,atFrame:n,name:S.name,idempotencyKey:S.idempotencyKey,progress:S.progress})}function m(S){if(S.phase="completed",S.progress=1,u(S,Ze),S.repeatRemaining==="forever"||S.repeatRemaining>0){if(typeof S.repeatRemaining=="number"&&(S.repeatRemaining-=1),S.repeatIndex+=1,S.phase="scheduled",S.progress=0,S.startFrame=n,S.delayFrames=0,S.durationFrames===0){r.delete(S.idempotencyKey);return}S.phase="active",u(S,Ue)}else r.delete(S.idempotencyKey)}function g(S){if(S.phase==="cancelled"||S.phase==="completed")return;let L=cn(S);if(!(n<L)){if(S.phase==="scheduled"&&(S.phase="active",S.progress=S.durationFrames===0?1:0,u(S,Ue),S.durationFrames===0)){m(S);return}if(S.phase==="active"){let _=n-L;_>=S.durationFrames?(S.progress=1,m(S)):S.progress=Mo(S.durationFrames===0?1:_/S.durationFrames,S.easing)}}}function b(){let S=[...r.values()].sort(d);for(let L of S)g(L)}function h(S){let L=Fo(S,n);if("ok"in L&&L.ok===!1)return L;let _=Lo(L,t),K=r.get(_.idempotencyKey);if(K&&(K.phase==="scheduled"||K.phase==="active")){if(K.onDuplicate==="reject"||_.onDuplicate==="reject")return{ok:!1,reason:"duplicate",detail:`cue ${_.idempotencyKey} is already ${K.phase}`};if(K.onDuplicate==="ignore"||_.onDuplicate==="ignore")return{ok:!0,cue:Rt(K)};K.phase="cancelled",K.progress=K.progress,u(K,Ie),r.delete(K.idempotencyKey)}r.set(_.idempotencyKey,_),g(_);let w=r.get(_.idempotencyKey)??_;return{ok:!0,cue:Rt(w)}}function A(S){let L=r.get(S);return!L||L.phase==="completed"||L.phase==="cancelled"?!1:(L.phase="cancelled",u(L,Be),r.delete(S),!0)}function F(){for(let S of[...r.values()].sort(d))(S.phase==="scheduled"||S.phase==="active")&&(S.phase="cancelled",u(S,Be));r.clear(),i.length=0,n=e.originFrame??0}function R(S=1){let L=Number.isFinite(S)?Math.max(0,Math.floor(S)):0,_=i.length;for(let K=0;K<L;K++)n+=1,b();return i.slice(_).map(Pr)}return{play:h,step:R,cancel:A,reset:F,snapshot(){return{frame:n,reducedMotion:t,cues:[...r.values()].sort(d).map(Rt),events:i.map(Pr)}},get(S){let L=r.get(S);return L?Rt(L):void 0},get frame(){return n},get reducedMotion(){return t}}}var Vo="audio.cue.scheduled",Ho="audio.cue.started",Oo="audio.cue.skipped",_o="audio.cue.failed";function ln(e){let t={type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,assetId:e.assetId,channelId:e.channelId,progress:e.progress};return e.participantId!==void 0&&(t.participantId=e.participantId),e.reason!==void 0&&(t.reason=e.reason),t}function No(e){return{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,repeat:e.repeat,reducedMotion:e.reducedMotion,onDuplicate:e.onDuplicate}}function xt(e,t,n){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:t?.phase??(e.audioPhase==="started"?"active":"scheduled"),startFrame:t?.startFrame??n,durationFrames:t?.durationFrames??0,delayFrames:t?.delayFrames??0,easing:t?.easing??"linear",progress:t?.progress??0,repeatIndex:t?.repeatIndex??0,assetId:e.assetId,channelId:e.channelId,participantId:e.participantId,priority:e.priority,audioPhase:e.audioPhase}}function Ko(e={}){let t=e.broker,n=!!(e.reducedSensory??t?.reducedSensory),r=et({originFrame:e.originFrame}),i=new Map,o=[],d=new Set,u=0;function m(s){o.push(s)}function g(s,c,I){let j=r.get(c.idempotencyKey);return ln({type:s,atFrame:r.frame,name:c.name,idempotencyKey:c.idempotencyKey,assetId:c.assetId,channelId:c.channelId,participantId:c.participantId,reason:I?.reason,progress:I?.progress??j?.progress??0})}function b(s,c){d.delete(s.idempotencyKey),t?.noteCueEnded(s.idempotencyKey),s.audioPhase="failed",m(g(_o,s,{reason:c})),r.cancel(s.idempotencyKey),i.delete(s.idempotencyKey)}function h(s,c){d.delete(s.idempotencyKey),s.audioPhase="skipped",m(g(Oo,s,{reason:c}))}function A(s){d.delete(s.idempotencyKey),s.audioPhase="started",t?.noteCueStarted({idempotencyKey:s.idempotencyKey,channelId:s.channelId,participantId:s.participantId,priority:s.priority}),m(g(Ho,s))}function F(s){if(s.audioPhase!=="scheduled")return;if(t&&!t.isAuthorized(s.participantId)){h(s,"unauthorized"),r.cancel(s.idempotencyKey),i.delete(s.idempotencyKey);return}if(n||t?.reducedSensory){h(s,"reduced-sensory");return}if(t?.muted||t&&t.effectiveGain(s.channelId)===0){h(s,"muted");return}let c=t?.assetStatus(s.assetId);if(!t){A(s);return}if(c==="failed"){b(s,"asset-failed");return}if(c==="ready"){A(s);return}d.add(s.idempotencyKey)}function R(s,c){for(let I of[...d]){let j=i.get(I);if(!j){d.delete(I);continue}if(!(s&&j.assetId!==s)){if(c==="failed"||t?.assetStatus(j.assetId)==="failed"){b(j,"asset-failed");continue}(c==="ready"||t?.assetStatus(j.assetId)==="ready")&&F(j)}}}function S(s){for(let c of[...i.values()])c.participantId===s&&(c.audioPhase==="scheduled"||c.audioPhase==="started")&&b(c,"torn-down")}function L(s){for(let c of s){let I=i.get(c.idempotencyKey);if(I)if(c.type===Ue)F(I);else if(c.type===Ze){if(d.delete(I.idempotencyKey),t?.noteCueEnded(I.idempotencyKey),r.get(I.idempotencyKey)){I.audioPhase="scheduled";continue}I.audioPhase==="scheduled"?b(I,"asset-failed"):(I.audioPhase==="started"&&(I.audioPhase="completed"),i.delete(I.idempotencyKey))}else c.type===Be?(d.delete(I.idempotencyKey),t?.noteCueEnded(I.idempotencyKey),(I.audioPhase==="scheduled"||I.audioPhase==="started")&&(I.audioPhase="failed"),i.delete(I.idempotencyKey)):c.type===Ie&&(d.delete(I.idempotencyKey),t?.noteCueEnded(I.idempotencyKey),i.delete(I.idempotencyKey))}}function _(){let s=o.slice(u).map(ln);return u=o.length,s}let K=t?.onNotice(s=>{if(s.type==="asset"){if(s.status==="failed"){for(let c of[...i.values()])c.assetId===s.id&&(c.audioPhase==="scheduled"||c.audioPhase==="started")&&b(c,"asset-failed");return}R(s.id,s.status);return}if(s.type==="teardown"){S(s.participantId);return}if(s.type==="destroy")for(let c of[...i.values()])(c.audioPhase==="scheduled"||c.audioPhase==="started")&&b(c,"torn-down")});function w(){for(let s of i.values())t?.noteCueEnded(s.idempotencyKey);i.clear(),d.clear(),o.length=0,u=0,r.reset()}function v(s){if(!s||typeof s!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof s.assetId!="string"||s.assetId.length===0)return{ok:!1,reason:"invalid",detail:"assetId is required"};let c=r.snapshot().events.length,I=r.play(No(s));if(!I.ok)return I;let j=r.snapshot().events.slice(c),Y=j.some(V=>V.type===Ie);if(!Y&&i.has(s.idempotencyKey)){let V=i.get(s.idempotencyKey);return{ok:!0,cue:xt(V,I.cue,r.frame)}}if(Y){let V=i.get(s.idempotencyKey);V&&(d.delete(V.idempotencyKey),t?.noteCueEnded(V.idempotencyKey),i.delete(V.idempotencyKey))}let q=s.channelId??s.participantId??"master",J={name:s.name,idempotencyKey:s.idempotencyKey,assetId:s.assetId,channelId:q,participantId:s.participantId,priority:Number.isFinite(s.priority)?s.priority:0,audioPhase:"scheduled"};i.set(J.idempotencyKey,J),typeof s.gain=="number"&&t?.setChannelGain(q,s.gain,s.participantId),typeof s.priority=="number"&&t?.setPriority(q,s.priority,s.participantId),m(g(Vo,J)),L(j.filter(V=>V.type!==Ie));let z=i.get(J.idempotencyKey);z&&z.audioPhase==="scheduled"&&t?.assetStatus(z.assetId)==="failed"&&b(z,"asset-failed"),_();let p=i.get(J.idempotencyKey)??J,D=r.get(J.idempotencyKey)??I.cue;return{ok:!0,cue:xt(p,D,r.frame)}}return{play:v,step(s=1){let c=r.step(s);return L(c),_()},cancel(s){let c=i.get(s),I=r.cancel(s);return c&&(d.delete(s),t?.noteCueEnded(s),i.delete(s)),I},reset:w,snapshot(){return{frame:r.frame,reducedSensory:n,cues:[...i.values()].map(s=>xt(s,r.get(s.idempotencyKey),r.frame)).sort((s,c)=>s.name!==c.name?s.name<c.name?-1:1:s.idempotencyKey<c.idempotencyKey?-1:s.idempotencyKey>c.idempotencyKey?1:0),events:o.map(ln)}},get(s){let c=i.get(s);if(c)return xt(c,r.get(s),r.frame)},dispose(){K?.(),w()},get frame(){return r.frame},get reducedSensory(){return n}}}function Uo(e={}){let t=ur({toneStart:async()=>{},reducedSensory:e.reducedSensory}),n=Ko({broker:t,originFrame:e.originFrame,reducedSensory:e.reducedSensory});return{broker:t,timeline:n,unlock(){return t.unlock()},play(r){return n.play(r)},step(r){return n.step(r)},handleHostEvent(r){t.handleHostEvent(r)},snapshot(){return{...n.snapshot(),unlock:t.status(),muted:t.muted}},destroy(){n.dispose(),t.destroy()}}}var Dr=1,Bo=["layer","mask","sprite"],$o=["show","hide","replace","crossfade"],Go=":incoming",jo="visual.layer.revealed",Mr="visual.layer.hidden",Wo="visual.layer.transition-started",zo="visual.layer.transition-completed",Fr="visual.layer.failed";var qo="host.state.accepted";var Yo="Visual layer controller has been destroyed",Jo=new Set(Bo),Xo=new Set($o);function Qo(e){return typeof e=="string"&&Jo.has(e)}function Zo(e){return typeof e=="string"&&Xo.has(e)}function ea(e){return`${e}${Go}`}function ta(e){return{frame:e.captureComposedFrame(),layers:e.inspect()}}function na(e){return{data:new Uint8ClampedArray(e.data),width:e.width,height:e.height,colorSpace:e.colorSpace??"srgb"}}function $e(e){return JSON.parse(JSON.stringify(e))}function It(e){if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function ra(e){let t=It(e);return typeof t?.id=="string"&&t.id.length>0?t.id:void 0}function ia(e){if(!e||typeof e!="object")return;let t=e;if(!(typeof t.id!="string"||typeof t.ref!="string"||typeof t.code!="string"||typeof t.message!="string"))return t}function fe(e,t){if(t)return e.versions.find(n=>n.id===t)}function Lr(e){return e?{...e}:null}function oa(e){if(!e?.compositor)throw new Error("createVisualLayerController: compositor is required");if(!e.layers?.length)throw new Error("createVisualLayerController: at least one layer is required");let t=e.compositor,n=e.preloader,r=!!e.reducedMotion,i=e.fallback??"keep-prior",o=et({originFrame:e.originFrame,reducedMotion:r}),d=e.sceneId??null,u=!1,m=0,g=new Map,b=new Map,h=new Map,A=new Map,F=[],R=[],S=()=>{if(u)throw new Error(Yo)};function L(a){F.push(a),e.dispatch&&e.dispatch({type:a.type,kind:a.type===Fr?"diagnostic":"state",payload:a})}function _(a){R.push(a),L({type:Fr,atFrame:a.atFrame,layerId:a.layerId,version:a.version,progress:0,code:a.code})}function K(a,C){h.set(a,C)}function w(a){let C=h.get(a);if(C)return C;if(n?.get(a))return"ready";let E=n?.getProgress().items[a];return E?.state==="failed"?"failed":E?.state==="ready"?"ready":"pending"}function v(a){let C=b.get(a);if(C)return C.kind==="canvas"?{kind:"canvas",canvas:C.canvas}:{kind:"image",image:C.image}}function s(a,C){let E=fe(a.declaration,C);return E?w(E.assetId)==="ready"&&!!v(E.assetId):!1}function c(a){return a.overrideVersion&&s(a,a.overrideVersion)?a.overrideVersion:a.committedVersion}function I(a,C){let E=fe(a.declaration,C);return E?Lr(A.get(E.assetId))??Lr(E.provenance)??null:null}function j(a,C=0){return o.get(a)?.progress??C}function Y(a,C,E){try{t.layer(a)}catch{t.addLayer({id:a,order:C,visible:!1,opacity:0,pointerEvents:E.pointerEvents??"none",blend:E.blend,clip:E.clip??void 0,clearPolicy:E.clearPolicy})}}function q(a){try{t.setLayer(a.incomingLayerId,{visible:!1,opacity:0})}catch{}}function J(){for(let a of g.values()){let C=c(a),E=fe(a.declaration,C),M=a.transition,N=M?j(M.cueKey):0,Q=M?.kind==="crossfade"&&M.toVersion!==null&&s(a,M.toVersion);Y(a.compositorLayerId,a.order,a);let Z=a.visible,W=1;M?.kind==="hide"?(W=1-N,N>=1&&(Z=!1)):M?.kind==="show"?(Z=s(a,M.toVersion),W=Z?M.durationFrames===0?1:N:0):Q&&(W=1-N);let te=E?v(E.assetId):void 0;if(t.setLayer(a.compositorLayerId,{order:a.order,visible:Z&&!!te,opacity:W,blend:a.blend,clip:a.clip??void 0,pointerEvents:a.pointerEvents,clearPolicy:a.clearPolicy,source:te}),Q&&M){let ie=fe(a.declaration,M.toVersion),ve=ie?v(ie.assetId):void 0;if(ve){try{t.layer(a.incomingLayerId)}catch{t.addLayer({id:a.incomingLayerId,order:a.order+1,visible:!1,opacity:0,pointerEvents:"none",blend:a.blend,clip:a.clip??void 0,clearPolicy:a.clearPolicy})}t.setLayer(a.incomingLayerId,{order:a.order+1,visible:!0,opacity:N,blend:a.blend,clip:a.clip??void 0,pointerEvents:"none",clearPolicy:a.clearPolicy,source:ve});continue}}q(a)}}function z(a){let C=c(a);return{id:a.declaration.id,kind:a.kind,visible:a.visible&&!!(C&&s(a,C)),activeVersion:C,pendingVersion:a.pendingVersion,committedVersion:a.committedVersion,opacity:t.layer(a.compositorLayerId).opacity,order:a.order,provenance:I(a,C),overrideVersion:a.overrideVersion,transition:a.transition?{kind:a.transition.kind,progress:j(a.transition.cueKey),fromVersion:a.transition.fromVersion,toVersion:a.transition.toVersion,cueKey:a.transition.cueKey,startFrame:a.transition.startFrame,durationFrames:a.transition.durationFrames,delayFrames:a.transition.delayFrames,easing:a.transition.easing}:null}}function p(a,C,E){a.committedVersion=C,a.pendingVersion=null,a.transition=null,a.visible=E,J(),L({type:E?jo:Mr,atFrame:o.frame,layerId:a.declaration.id,version:C,progress:1})}function D(a){a.visible=!1,a.pendingVersion=null,a.transition=null,J(),L({type:Mr,atFrame:o.frame,layerId:a.declaration.id,version:a.committedVersion??void 0,progress:1})}function V(a,C,E,M){let N=a.fallback;a.transition=null,a.pendingVersion=null,N==="hide"?a.visible=!1:typeof N=="object"&&N.version&&s(a,N.version)&&(a.committedVersion=N.version,a.visible=!0),J(),_({code:M?"asset-failed":"missing-source",layerId:a.declaration.id,version:C??void 0,assetId:E,message:M?M.message:`visual layer "${a.declaration.id}" kept the prior valid frame`,atFrame:o.frame,failure:M})}function X(a){let C=a.transition;if(C?.kind==="hide")return D(a),!0;let E=a.pendingVersion??C?.toVersion??null;if(!E)return a.transition=null,!0;if(!fe(a.declaration,E))return V(a,E),!0;if(s(a,E))return p(a,E,!0),!0;let M=fe(a.declaration,E).assetId;return w(M)==="failed"?(V(a,E,M),!0):(a.transition=null,a.pendingVersion=E,J(),!1)}function l(){for(let a of g.values())if(!a.transition&&a.pendingVersion){if(s(a,a.pendingVersion))p(a,a.pendingVersion,!0);else if(w(fe(a.declaration,a.pendingVersion)?.assetId??"")==="failed"){let C=fe(a.declaration,a.pendingVersion);V(a,a.pendingVersion,C?.assetId)}}for(let a of g.values())a.overrideVersion&&s(a,a.overrideVersion)&&a.committedVersion!==a.overrideVersion&&p(a,a.overrideVersion,!0)}function y(a,C){K(a,"failed");for(let E of g.values()){let M=E.declaration.versions.find(te=>te.assetId===a);if(!M)continue;let N=fe(E.declaration,E.pendingVersion),Q=fe(E.declaration,E.transition?.toVersion??null),Z=fe(E.declaration,E.overrideVersion);if(N?.assetId===a||Q?.assetId===a||Z?.assetId===a){E.transition&&o.cancel(E.transition.cueKey),Z?.assetId===a&&(E.overrideVersion=null),V(E,M.id,a,C);continue}_({code:"asset-failed",layerId:E.declaration.id,version:M.id,assetId:a,message:C?.message??`asset "${a}" failed; prior frame kept`,atFrame:o.frame,failure:C}),J()}}function k(a){for(let C of a){let E=[...g.values()].find(M=>M.transition?.cueKey===C.idempotencyKey);if(!(!E||!E.transition))if(C.type===Ue)L({type:Wo,atFrame:C.atFrame,layerId:E.declaration.id,version:E.transition.toVersion??void 0,kind:E.transition.kind,progress:C.progress}),J();else if(C.type===Ze){let M=E.transition.kind,N=E.transition.toVersion??void 0;X(E),L({type:zo,atFrame:C.atFrame,layerId:E.declaration.id,version:N,kind:M,progress:1})}else(C.type===Be||C.type===Ie)&&(E.transition=null,J())}}function T(){let a=F.slice(m).map(C=>$e(C));return m=F.length,a}for(let a of e.layers){if(!a?.id)throw new Error("createVisualLayerController: layer id is required");if(g.has(a.id))throw new Error(`createVisualLayerController: duplicate layer id "${a.id}"`);if(!Qo(a.kind))throw new Error(`createVisualLayerController: layer "${a.id}" kind is invalid`);if(!a.versions?.length)throw new Error(`createVisualLayerController: layer "${a.id}" needs versions`);let C=new Set;for(let W of a.versions){if(!W?.id||!W.assetId)throw new Error(`createVisualLayerController: layer "${a.id}" versions need id and assetId`);if(C.has(W.id))throw new Error(`createVisualLayerController: layer "${a.id}" duplicate version "${W.id}"`);C.add(W.id),W.provenance&&A.set(W.assetId,{...W.provenance})}if(a.initialVersion&&!C.has(a.initialVersion))throw new Error(`createVisualLayerController: layer "${a.id}" unknown initialVersion`);let E=a.compositorLayerId??a.id,M=a.incomingLayerId??ea(E),N=a.order??0,Q=a.pointerEvents??(a.kind==="mask"?"none":"auto"),Z={declaration:a,compositorLayerId:E,incomingLayerId:M,kind:a.kind,order:N,blend:a.blend??"source-over",clip:a.clip?{...a.clip}:null,pointerEvents:Q,clearPolicy:a.clearPolicy??"opaque",fallback:a.fallback??i,visible:!!a.initialVersion,committedVersion:a.initialVersion??null,pendingVersion:null,overrideVersion:null,transition:null};g.set(a.id,Z),Y(E,N,Z)}J();function P(a){if(S(),!a||typeof a!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(!a.layerId)return{ok:!1,reason:"invalid",detail:"layerId is required"};let C=g.get(a.layerId);if(!C)return{ok:!1,reason:"invalid",detail:`unknown layer "${a.layerId}"`};if(!Zo(a.kind))return{ok:!1,reason:"invalid",detail:"unsupported kind"};if(a.kind!=="hide"&&!a.toVersion)return{ok:!1,reason:"invalid",detail:"toVersion is required"};if(a.toVersion&&!fe(C.declaration,a.toVersion))return{ok:!1,reason:"invalid",detail:`unknown version "${a.toVersion}"`};let E={name:a.name,idempotencyKey:a.idempotencyKey,startFrame:a.startFrame,durationFrames:a.durationFrames,delayFrames:a.delayFrames,easing:a.easing,repeat:a.repeat,reducedMotion:a.reducedMotion,onDuplicate:a.onDuplicate??"replace"},M=o.snapshot().events.length,N=o.play(E);if(!N.ok)return N;let Q=o.snapshot().events.slice(M);return C.pendingVersion=a.kind==="hide"?C.committedVersion:a.toVersion??null,C.transition={kind:a.kind,cueKey:a.idempotencyKey,fromVersion:a.fromVersion??C.committedVersion,toVersion:a.kind==="hide"?C.committedVersion:a.toVersion??null,startFrame:N.cue.startFrame,durationFrames:N.cue.durationFrames,delayFrames:N.cue.delayFrames,easing:N.cue.easing},k(Q),J(),T(),N}function H(a){let C=It(a),E=typeof C?.sceneId=="string"?C.sceneId:void 0;if(e.sceneId&&E&&E!==e.sceneId)return;E&&(d=E);let M=typeof C?.layerId=="string"?C.layerId:typeof C?.overlayId=="string"?C.overlayId:void 0,N=typeof C?.version=="string"?C.version:void 0;if(M&&N){P({name:`visual:${M}:replace`,idempotencyKey:`visual:${M}:accepted`,layerId:M,kind:"replace",toVersion:N,durationFrames:2});return}for(let Q of e.onAccepted??[])P({name:`visual:${Q.layerId}:${Q.kind??"replace"}`,idempotencyKey:Q.idempotencyKey??`visual:${Q.layerId}:accepted`,layerId:Q.layerId,kind:Q.kind??"replace",toVersion:Q.toVersion,durationFrames:Q.durationFrames??2,delayFrames:Q.delayFrames,easing:Q.easing})}function U(){let a=[...g.values()].map(E=>{let M=z(E);return{id:E.declaration.id,kind:E.kind,visible:E.visible,committedVersion:E.committedVersion,pendingVersion:E.pendingVersion,activeVersion:M.activeVersion,opacity:M.opacity,order:E.order,overrideVersion:E.overrideVersion,provenance:M.provenance,fallback:E.fallback,transition:M.transition}}).sort((E,M)=>E.id<M.id?-1:E.id>M.id?1:0),C={};for(let[E,M]of[...h.entries()].sort(([N],[Q])=>N<Q?-1:N>Q?1:0))C[E]=M;return $e({schemaVersion:Dr,frame:o.frame,sceneId:d,reducedMotion:r,layers:a,assets:C,events:F.map(E=>$e(E)),diagnostics:R.map(E=>$e(E))})}function B(a){S();let C=[],E=Z=>{let W={code:"invalid-snapshot",layerId:"",message:Z,atFrame:o.frame};return{ok:!1,errors:[...C,W]}},M=a;if(typeof a=="string")try{M=JSON.parse(a)}catch{return E("snapshot JSON is invalid")}if(!M||typeof M!="object"||Array.isArray(M))return E("snapshot must be an object");let N=M;if(N.schemaVersion!==Dr)return E("unsupported visual layer snapshot schema");if(typeof N.frame!="number"||!Number.isFinite(N.frame))return E("frame must be finite");if(!Array.isArray(N.layers))return E("layers must be an array");if(o=et({originFrame:N.frame,reducedMotion:r}),d=typeof N.sceneId=="string"||N.sceneId===null?N.sceneId:d,F.length=0,R.length=0,m=0,Array.isArray(N.events)&&(F.push(...N.events.map(Z=>$e(Z))),m=F.length),Array.isArray(N.diagnostics)&&R.push(...N.diagnostics.map(Z=>$e(Z))),h.clear(),N.assets&&typeof N.assets=="object")for(let[Z,W]of Object.entries(N.assets))(W==="ready"||W==="failed"||W==="pending")&&h.set(Z,W);let Q=new Map(N.layers.map(Z=>[Z.id,Z]));for(let Z of g.values()){let W=Q.get(Z.declaration.id);W&&(Z.visible=!!W.visible,Z.committedVersion=W.committedVersion??null,Z.pendingVersion=W.pendingVersion??null,Z.overrideVersion=W.overrideVersion??null,Z.transition=null,W.transition&&o.play({name:`visual:${Z.declaration.id}:${W.transition.kind}`,idempotencyKey:W.transition.cueKey,startFrame:W.transition.startFrame,durationFrames:W.transition.durationFrames,delayFrames:W.transition.delayFrames,easing:W.transition.easing,onDuplicate:"replace"}).ok&&(Z.transition={kind:W.transition.kind,cueKey:W.transition.cueKey,fromVersion:W.transition.fromVersion,toVersion:W.transition.toVersion,startFrame:W.transition.startFrame,durationFrames:W.transition.durationFrames,delayFrames:W.transition.delayFrames,easing:W.transition.easing}))}return J(),{ok:!0,snapshot:U()}}return{registerSource(a,C){if(S(),typeof a!="string"||a.length===0)throw new Error("createVisualLayerController: assetId is required");if(C instanceof HTMLCanvasElement)b.set(a,{kind:"canvas",canvas:C});else if(C&&"data"in C&&"width"in C)b.set(a,{kind:"image",image:na(C)});else throw new Error("createVisualLayerController: source must be ImageData or canvas");l(),J()},handleHostEvent(a){if(S(),!a||typeof a!="object")return;if(a.type===qo){H(a.payload);return}let C=ra(a.payload);if(C){if(a.type===Ae){K(C,"ready");let M=It(a.payload)?.resource;if(M&&typeof M=="object"&&"provenance"in M){let N=M.provenance;N&&A.set(C,{...N})}l(),J();return}if(a.type===Ce){let E=It(a.payload);y(C,ia(E?.failure))}}},override(a,C){S();let E=g.get(a);if(!E)throw new Error(`createVisualLayerController: unknown layer "${a}"`);if(C===null){E.overrideVersion=null,J();return}if(!fe(E.declaration,C))throw new Error(`createVisualLayerController: unknown version "${C}" on "${a}"`);if(E.overrideVersion=C,s(E,C)){E.transition&&o.cancel(E.transition.cueKey),p(E,C,!0);return}J()},play:P,step(a=1){S();let C=o.step(a);return k(C),l(),J(),T()},snapshot(){return S(),U()},restore:B,inspect(){return S(),J(),[...g.values()].map(z).sort((a,C)=>a.id<C.id?-1:a.id>C.id?1:0)},captureComposedFrame(){return S(),J(),t.captureComposedFrame()},destroy(){u||(u=!0,o.reset(),F.length=0,R.length=0)},get frame(){return o.frame},get sceneId(){return d},get compositor(){return t}}}function aa(e,t){return{width:e,height:t,data:new Uint8ClampedArray(e*t*4),colorSpace:"srgb"}}function sa(){return{putImageData:()=>{}}}function da(e,t,n,r={}){let i=r.frames??30,o=r.warmupFrames??5,d=r.frameStepMs??1e3/60,u=r.width??1920,m=r.height??1080,g=r.tokenId??"18009999",b=new Le({hash:t,tokenId:g}),h=at(u,m),A=new st,F=e.getDefaultFeatureState?.(b,h,n,A),R=e.getDefaultState(b,h,n,A,void 0,void 0,void 0,F);r.prepareState?.(R,F);let S=aa(u,m),L=r.drawingContext??sa(),_=typeof e.render=="function",K=null,w=null,v=0,s=0,c=0,I=0,j=0;for(let p=1;p<=o+i;p++){let D=v+p*d,V=je(D,v,K,w),X=performance.now();e.update(b,p,n,h,R,A,void 0,void 0,V,F);let l=performance.now(),y=0;if(_){let T=je(D,v,K,w);e.render(b,p,n,h,R,L,S,void 0,void 0,T,F),y=performance.now()-l}let k=l-X;K=D,w=D,p>o&&(s+=k,c+=y,k>I&&(I=k),y>j&&(j=y))}A.destroy();let Y=s+c,q=s/i,J=c/i,z=Y/i;return{frames:i,updateAvgMs:q,renderAvgMs:J,totalAvgMs:z,updateMaxMs:I,renderMaxMs:j,estFps:z>0?1e3/z:1/0,updatePct:Y>0?100*s/Y:0,renderPct:Y>0?100*c/Y:0}}function ua(e,t=2){let n=r=>Number.isFinite(r)?Number(r.toFixed(t)):r;return{frames:e.frames,updateAvgMs:n(e.updateAvgMs),renderAvgMs:n(e.renderAvgMs),totalAvgMs:n(e.totalAvgMs),updateMaxMs:n(e.updateMaxMs),renderMaxMs:n(e.renderMaxMs),estFps:n(e.estFps),updatePct:n(e.updatePct),renderPct:n(e.renderPct)}}async function ad(e,t){let n=e.captureComposedFrame();if(!t)return n;let{writeFile:r}=await import("node:fs/promises");return await r(t,ot(n.pngDataUrl)),{...n,path:t}}export{mr as DEFAULT_HEADLESS_HEIGHT,pr as DEFAULT_HEADLESS_WIDTH,lr as HEADLESS_PNG_DATA_URL,ne as HeadlessUnsupportedOperationError,hr as UPDATE_GOLDEN_ENV,br as assertPixelsEqual,eo as assertPngDataUrlsEqual,Ht as attachHeadlessCanvas2D,da as benchmarkCartFrames,ta as captureVisualLayers,yr as compareImageData,To as compareReplayTraces,An as createDefaultGlyphAtlas,Uo as createHeadlessAudioAdapter,Zi as createHeadlessHarness,Eo as createHeadlessMultiCartHarness,_r as createImageFixture,Tr as createReplayInspector,oa as createVisualLayerController,Ot as decodePng,Pe as encodePng,De as encodePngDataUrl,ua as formatFrameBenchmarkResult,Nr as getHeadlessSurface,on as imageDataFromPngDataUrl,Et as installHeadlessCanvas,Se as makeImageData,Do as replayExportedTrace,Vt as setDefaultGlyphAtlas,gr as shouldUpdateGolden,ad as writeComposedFrame,no as writeVisualArtifacts};
|