class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,console.log("blockHeight",this.blockHeight),this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),e=document.createElement("script");function i(t){const e=new Uint8Array(t.length/2);for(var i=0;i<e.length;i++)e[i]=parseInt(t.substring(2*i,2*i+2),16);return e.buffer}e.innerHTML=await t.text(),document.body.appendChild(e);const o={};let n=null,s={},r=!1;if(null!==this.parcelId?console.log("parcelId",this.parcelId):(r=!0,console.log("isParent",r)),n=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,o=t=>e/2n**t,n=t/i;let s=0n;for(let t=0n;t<n;t++)s+=o(t)*i;return s+=t%i*o(n),String(s)})(this.blockHeight),console.log("potential sat",n),Number(this.blockHeight)<84e4){const e=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),o=await e.getBitmapSat(Number(this.blockHeight));console.log("potential Bitmap sat",o);const s=await fetch(`/r/sat/${o}/at/-1`).then((t=>t.json()));try{const t=await fetch(`/r/metadata/${s.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${s.id} metadata not found`)})).then((t=>CBOR.decode(i(t.replace(/"/g,"")))));console.log(t);const e=Number(t.blockHeight);console.log("bitmapBlockHeight",e),e===Number(this.blockHeight)&&(n=o,console.log(`sat on bitmap parent: ${n}`),console.log("bitmap parent reinscription id",s.id))}catch(t){console.log("no valid 3D reinscription found on Bitmap (or not a Bitmap)")}}if(n){console.log("parent inscribed on sat",n);const t=await fetch(`/r/sat/${n}/at/-1`).then((t=>t.json()));console.log("parent inscriptionId",t.id);let e=[],a=!0,l=0;if(t&&t.id){for(;a;){const i=await fetch(`/r/children/${t.id}/inscriptions/${l}`).then((t=>t.json()));a=i.more,e=e.concat(i.children),l+=1}console.log("Num of children",e.length)}if(e.length>0)for(let t=0;t<e.length;t++){const n=e[t];fetch(`/r/metadata/${n.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${n.id} metadata not found`)})).then((t=>CBOR.decode(i(t.replace(/"/g,""))))).then((async t=>{if(t&&t.parcelId){console.log(t);const e=Number(t.parcelId.split(":").pop());if(!(e in o)){if(o[e]=n.id,!r&&e!==this.parcelId)return;console.log("parcelId",e,"loaded",this.parcelId);const t=await fetch(`/r/sat/${n.sat}/at/-1`).then((t=>t.json()));if(console.log("parcel re-inscriptionId",t.id),n.id!==t.id){const i=await fetch(`/content/${t.id}`),o=await i.text(),n=(new DOMParser).parseFromString(o,"text/html");s[e]=n.querySelectorAll("ord-img"),console.log("ord-img content:",s[e][0]?.getAttribute("content"))}}}})).catch((t=>console.log(t)))}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:a}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{POSTPROCESSING:l}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),h=l.BloomEffect,c=l.EffectComposer,d=l.EffectPass,p=l.RenderPass,f=l.BlendFunction,w={headers:{Accept:"application/json"}},x=await fetch("/r/blockheight",w).then((t=>t.json())),g=await fetch(`/r/blockinfo/${x}`,w).then((t=>t.json()));console.log("latest blockHeight",x,"tx_count",g.transaction_count);const u=Math.floor(g.transaction_count/2);console.log("treasure tx: 1/2 tx x latest tx_count =",u),await this.fetchData();const m=u<this.txList.length?this.txList[u].value:0;console.log("treasure tx #",u,"in block",this.blockHeight,"has tx value in total of",m,"sats");for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value);let b=0;for(let t of this.txList)b+=t.size*t.size;let E=Math.ceil(Math.sqrt(b));this.mondrian=new MondrianLayout(E,E),a.install({THREE:THREE});const y=window.innerWidth,M=window.innerHeight,R=new THREE.Clock,H=new THREE.Scene,S=new THREE.PerspectiveCamera(90,y/M,.01,1e3);S.position.set(0,E/1.6,0);const T=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!1,stencil:!1,depth:!1});T.setSize(y,M),T.shadowMap.enabled=!0,T.shadowMap.type=THREE.BasicShadowMap;let I=new THREE.HemisphereLight(16777215,0,2);H.add(I);let k=new THREE.DirectionalLight(16777215,1);k.position.set(-10,100,-10),k.target.position.set(0,0,0),k.castShadow=!0,H.add(k),document.getElementById("root").appendChild(T.domElement);const L=new a(S,T.domElement);let B=13576336;this.blockHeight<84e4&&(B=16356896);const $=new THREE.MeshStandardMaterial({color:B,wireframe:!1}),v=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375});new THREE.MeshStandardMaterial({color:16225050,wireframe:!1});let A=0;for(let t=0;t<this.txList.length;t++){const e=this.mondrian.place(this.txList[t].size),i=.5*e.r,n=new THREE.Mesh(new THREE.BoxGeometry(.9*e.r,.2*e.r,.9*e.r),this.txList[t].value===m?v:$);if(r&&o&&o[t]){console.log("isParent",r,"loading child",o[t]);let n=null;n=t in o&&t in s&&s[t].length>0?new THREE.MeshStandardMaterial({color:16777215,wireframe:!1,map:(new THREE.TextureLoader).load(`/content/${s[t][0]?.getAttribute("content")}`)}):new THREE.MeshStandardMaterial({color:16777215,wireframe:!1});const a=new THREE.Mesh(new THREE.BoxGeometry(.6*e.r,.25*e.r,.6*e.r),n);a.position.set(e.position.x-E/2+i,.1*e.r/2,e.position.y-E/2+i),H.add(a)}else if(null!==this.parcelId&&t===this.parcelId){console.log("child parcelId",this.parcelId);const t=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1,map:this.parcelId&&s[this.parcelId]&&(new THREE.TextureLoader).load(`/content/${s[this.parcelId][0]?.getAttribute("content")}`)}),o=new THREE.Mesh(new THREE.BoxGeometry(.6*e.r,.25*e.r,.6*e.r),t);o.position.set(e.position.x-E/2+i,.1*e.r/2,e.position.y-E/2+i),H.add(o)}this.txList[t].value===m&&(A+=1),H.add(n),n.position.set(e.position.x-E/2+i,.1*e.r/2,e.position.y-E/2+i)}console.log("found",A,1!==A?"treasure parcels":"treasure parcel","with the same output value for BlockDrop");const C=new c(T);C.addPass(new p(H,S));const P=new h({blendFunction:f.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});C.addPass(new d(S,P)),T.render(H,S),C.render();let D=!0;!function t(){const e=R.getDelta(),i=R.getElapsedTime(),o=L.update(e);D&&(P.intensity=1+1*Math.sin(i),C.render(),i>30&&(D=!1)),requestAnimationFrame(t),o&&(D=!0)}()}async fetchData(){const t=await fetch(this.txValueCache).then((t=>t.text()));if(t){let e=t.split(/\r?\n/);this.txList=new Array(e.length);for(let t=0;t<e.length;t++){let i=parseInt(e[t]);this.txList[t]={value:i}}}}decompress=t=>{const e=Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),i=new DecompressionStream("gzip"),o=i.writable.getWriter();return o.write(e),o.close(),new Response(i.readable).arrayBuffer().then((function(t){return(new TextDecoder).decode(t)}))};logTxSize(t){if(0===t)return 1;let e=Math.ceil(Math.log10(t))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,e))}}class MondrianLayout{constructor(t,e){this.width=t,this.height=e,this.xMax=0,this.yMax=0,this.rowOffset=0,this.rows=[],this.txMap=[]}getSize(){return{width:this.xMax,height:this.yMax}}getRow(t){let e=t.y-this.rowOffset;return e<this.rows.length?this.rows[e]:null}getSlot(t){let e=this.getRow(t);return null!==e&&e.map.hasOwnProperty(t.x)?e.map[t.x]:null}addRow(){let t={y:this.rows.length+this.rowOffset,slots:[],map:{},max:0};return this.rows.push(t),t}addSlot(t){if(t.r<=0)return null;let e=this.getSlot(t.position);if(null!==e)return e.r=Math.max(e.r,t.r),e;{let e=this.getRow(t.position);if(null===e)return null;let i=e.slots.findIndex((e=>e.position.x>t.position.x));return-1===i?e.slots.push(t):e.slots.splice(i,0,t),e.map[t.position.x]=t,t}}removeSlot(t){let e=this.getRow(t.position);if(null!==e){delete e.map[t.position.x];let i=e.slots.findIndex((e=>e.position.x===t.position.x));-1!==i&&e.slots.splice(i,1)}}fillSlot(t,e){let i={left:t.position.x,right:t.position.x+e,bottom:t.position.y,top:t.position.y+e};this.removeSlot(t);for(let o=t.position.y;o<i.top;o++){let n=this.getRow({x:t.position.x,y:o});if(null!==n){let s=[],r=0;for(let e of n.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){s.push(e);let i=Math.max(0,e.position.x+e.r-(t.position.x+t.r));r=Math.max(r,i)}i.right<this.width&&!n.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:o},r:t.r-e+r});for(let e of s)e.r=t.position.x-e.position.x,0===e.r&&this.removeSlot(e)}else this.addRow(),t.position.x>0&&this.addSlot({position:{x:0,y:o},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:o},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let o=this.getRow({x:t.position.x,y:i});if(null!==o)for(let i=0;i<o.slots.length;i++){let n=o.slots[i];if(n.position.x<t.position.x+e&&n.position.x+n.r>t.position.x&&n.position.y+n.r>=t.position.y){let e=n.r;n.r=t.position.y-n.position.y;let i={x:n.position.x+n.r,y:n.position.y,width:e-n.r,height:n.r};for(;i.width>0&&i.height>0;)i.width<=i.height?(this.addSlot({position:{x:i.x,y:i.y},r:i.width}),i.y+=i.width,i.height-=i.width):(this.addSlot({position:{x:i.x,y:i.y},r:i.height}),i.x+=i.height,i.width-=i.height)}}}return{position:t.position,r:e}}place(t){let e={},i=!1,o=null;for(let e of this.rows){for(let n of e.slots)if(n.r>=t){i=!0,o=this.fillSlot(n,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});o=this.fillSlot(i,t)}for(let t=0;t<o.r;t++)for(let i=0;i<o.r;i++)this.setTxMapCell({x:o.position.x+t,y:o.position.y+i},e);return o.position.x+o.r>this.xMax&&(this.xMax=o.position.x+o.r),o.position.y+o.r>this.yMax&&(this.yMax=o.position.y+o.r),o}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let o=i*this.width+t.x;o>=0&&o<this.txMap.length&&(this.txMap[o]=e)}}}