class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t={};if(null!==this.parcelId)console.log("parcelId",this.parcelId);else{console.log("isParent",!0);let C="";if(C=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,o=t=>e/2n**t,s=t/i;let n=0n;for(let t=0n;t<s;t++)n+=o(t)*i;return n+=t%i*o(s),String(n)})(this.blockHeight),console.log("runescape gen-2 on sat",C),C){const P=await fetch(`/r/sat/${C}/at/-1`).then((t=>t.json()));console.log("inscriptionId",P.id);let z=[],A=!0,D=0;for(;A;){const _=await fetch(`/r/children/${P.id}/${D}`).then((t=>t.json()));A=_.more,z=z.concat(_.ids),D+=1}console.log("Num of children",z.length);const O=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),$=document.createElement("script");function G(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}if($.innerHTML=await O.text(),document.body.appendChild($),z.length>0)for(let j=0;j<z.length;j++){const N=z[j];fetch(`/r/metadata/${N}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${N} metadata not found`)})).then((t=>CBOR.decode(G(t.replace(/"/g,""))))).then((e=>{if(e){const i=e.parcelId.split(":").pop();i in t||(t[i]=N,console.log("parcelId",i,"indexed"))}})).catch((t=>console.log(t)))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:e}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{POSTPROCESSING:i}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),o=i.BloomEffect,s=i.EffectComposer,n=i.EffectPass,r=i.RenderPass,l=i.BlendFunction,a={headers:{Accept:"application/json"}},h=await fetch("/r/blockheight",a).then((t=>t.json())),c=await fetch(`/r/blockinfo/${h}`,a).then((t=>t.json()));console.log("latest blockHeight",h,"tx_count",c.transaction_count);const d=Math.floor(c.transaction_count/2);console.log("treasure tx: 1/2 tx x latest tx_count =",d),await this.fetchData();const p=d<this.txList.length?this.txList[d].value:0;console.log("treasure tx #",d,"in block",this.blockHeight,"has tx value in total of",p,"sats");for(let F=0;F<this.txList.length;F++)this.txList[F].size=this.logTxSize(this.txList[F].value);let f=0;for(let W of this.txList)f+=W.size*W.size;let x=Math.ceil(Math.sqrt(f));this.mondrian=new MondrianLayout(x,x),e.install({THREE:THREE});const w=window.innerWidth,u=window.innerHeight,g=new THREE.Clock,m=new THREE.Scene,y=new THREE.PerspectiveCamera(90,w/u,.01,1e3);y.position.set(0,x/1.6,0);const E=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!1,stencil:!1,depth:!1});E.setSize(w,u),E.shadowMap.enabled=!0,E.shadowMap.type=THREE.BasicShadowMap;let M=new THREE.HemisphereLight(16777215,0,2);m.add(M);let b=new THREE.DirectionalLight(16777215,1);b.position.set(-10,100,-10),b.target.position.set(0,0,0),b.castShadow=!0,m.add(b),document.getElementById("root").appendChild(E.domElement);const R=new e(y,E.domElement);let S=13576336;this.blockHeight<84e4&&(S=16356896);const T=new THREE.MeshStandardMaterial({color:S,wireframe:!1}),H=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),L=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375}),I=new s(E);I.addPass(new r(m,y));const k=new o({blendFunction:l.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});I.addPass(new n(y,k));let v=0;for(let q=0;q<this.txList.length;q++){const U=this.mondrian.place(this.txList[q].size),V=.5*U.r,X=new THREE.Mesh(new THREE.BoxGeometry(.9*U.r,.2*U.r,.9*U.r),this.txList[q].value===p?L:T);if(t&&t[q]){const J=new THREE.Mesh(new THREE.BoxGeometry(.6*U.r,.25*U.r,.6*U.r),H);J.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V),m.add(J)}if(null!==this.parcelId&&q===this.parcelId){const K=new THREE.Mesh(new THREE.BoxGeometry(.6*U.r,.25*U.r,.6*U.r),H);K.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V),m.add(K)}this.txList[q].value===p&&(v+=1),m.add(X),X.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V)}console.log("found",v,1!==v?"treasure parcels":"treasure parcel","with the same output value for BlockDrop"),E.render(m,y),I.render();let B=!1;!function t(){const e=g.getDelta(),i=g.getElapsedTime(),o=R.update(e);B&&(k.intensity=2+2*Math.sin(i),I.render(),i>30&&(B=!1)),requestAnimationFrame(t),o&&(B=!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 s=this.getRow({x:t.position.x,y:o});if(null!==s){let n=[],r=0;for(let e of s.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){n.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&&!s.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:o},r:t.r-e+r});for(let e of n)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 s=o.slots[i];if(s.position.x<t.position.x+e&&s.position.x+s.r>t.position.x&&s.position.y+s.r>=t.position.y){let e=s.r;s.r=t.position.y-s.position.y;let i={x:s.position.x+s.r,y:s.position.y,width:e-s.r,height:s.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 s of e.slots)if(s.r>=t){i=!0,o=this.fillSlot(s,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)}}}