export class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,i){this.blockHeight=`${t}`,this.txValueCache=i,this.loadRoutine()}async loadRoutine(){const t=await fetch("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0"),i=await import(`data:text/javascript,${encodeURIComponent(await t.text())}`),e=await fetch("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),o=(await import(`data:text/javascript,${encodeURIComponent(await e.text())}`)).default;await this.fetchData();for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value);let s=0;for(let t of this.txList)s+=t.size*t.size;let n=Math.ceil(Math.sqrt(s));this.mondrian=new MondrianLayout(n,n),o.install({THREE:i});const r=window.innerWidth,h=window.innerHeight,l=new i.Clock,a=new i.Scene,p=new i.PerspectiveCamera(90,r/h,.01,1e3);p.position.set(0,n/1.6,0);const d=new i.WebGLRenderer;d.setSize(r,h),d.shadowMap.enabled=!0,d.shadowMap.type=i.BasicShadowMap;let x=new i.HemisphereLight(16777215,0,2);a.add(x);let f=new i.DirectionalLight(16777215,1);f.position.set(-10,20,-10),f.target.position.set(0,0,0),f.castShadow=!0,a.add(f),document.getElementById("root").appendChild(d.domElement);const w=new o(p,d.domElement);let c=13576336;this.blockHeight<84e4&&(c=16356896);const u=new i.MeshStandardMaterial({color:c,wireframe:!1});for(let t=0;t<this.txList.length;t++){const e=this.mondrian.place(this.txList[t].size),o=.5*e.r,s=new i.Mesh(new i.BoxGeometry(.9*e.r,.2*e.r,.9*e.r),u);a.add(s),s.position.set(e.position.x-n/2+o,.1*e.r/2,e.position.y-n/2+o)}d.render(a,p),function t(){const i=l.getDelta(),e=w.update(i);requestAnimationFrame(t),e&&d.render(a,p)}()}async fetchData(){const t=await fetch(this.txValueCache).then((t=>t.text()));if(t){let i=t.split(/\r?\n/);this.txList=new Array(i.length);for(let t=0;t<i.length;t++){let e=parseInt(i[t]);this.txList[t]={value:e}}}}decompress=t=>{const i=Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),e=new DecompressionStream("gzip"),o=e.writable.getWriter();return o.write(i),o.close(),new Response(e.readable).arrayBuffer().then((function(t){return(new TextDecoder).decode(t)}))};logTxSize(t){if(0===t)return 1;let i=Math.ceil(Math.log10(t))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,i))}}class MondrianLayout{constructor(t,i){this.width=t,this.height=i,this.xMax=0,this.yMax=0,this.rowOffset=0,this.rows=[],this.txMap=[]}getSize(){return{width:this.xMax,height:this.yMax}}getRow(t){let i=t.y-this.rowOffset;return i<this.rows.length?this.rows[i]:null}getSlot(t){let i=this.getRow(t);return null!==i&&i.map.hasOwnProperty(t.x)?i.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 i=this.getSlot(t.position);if(null!==i)return i.r=Math.max(i.r,t.r),i;{let i=this.getRow(t.position);if(null===i)return null;let e=i.slots.findIndex((i=>i.position.x>t.position.x));return-1===e?i.slots.push(t):i.slots.splice(e,0,t),i.map[t.position.x]=t,t}}removeSlot(t){let i=this.getRow(t.position);if(null!==i){delete i.map[t.position.x];let e=i.slots.findIndex((i=>i.position.x===t.position.x));-1!==e&&i.slots.splice(e,1)}}fillSlot(t,i){let e={left:t.position.x,right:t.position.x+i,bottom:t.position.y,top:t.position.y+i};this.removeSlot(t);for(let o=t.position.y;o<e.top;o++){let s=this.getRow({x:t.position.x,y:o});if(null!==s){let n=[],r=0;for(let i of s.slots)if(!(i.position.x+i.r<e.left||i.position.x>=e.right)){n.push(i);let e=Math.max(0,i.position.x+i.r-(t.position.x+t.r));r=Math.max(r,e)}e.right<this.width&&!s.map.hasOwnProperty(e.right)&&this.addSlot({position:{x:e.right,y:o},r:t.r-i+r});for(let i of n)i.r=t.position.x-i.position.x,0===i.r&&this.removeSlot(i)}else this.addRow(),t.position.x>0&&this.addSlot({position:{x:0,y:o},r:t.position.x}),e.right<this.width&&this.addSlot({position:{x:e.right,y:o},r:this.width-e.right})}for(let e=Math.max(0,t.position.y-i);e<t.position.y;e++){let o=this.getRow({x:t.position.x,y:e});if(null!==o)for(let e=0;e<o.slots.length;e++){let s=o.slots[e];if(s.position.x<t.position.x+i&&s.position.x+s.r>t.position.x&&s.position.y+s.r>=t.position.y){let i=s.r;s.r=t.position.y-s.position.y;let e={x:s.position.x+s.r,y:s.position.y,width:i-s.r,height:s.r};for(;e.width>0&&e.height>0;)e.width<=e.height?(this.addSlot({position:{x:e.x,y:e.y},r:e.width}),e.y+=e.width,e.height-=e.width):(this.addSlot({position:{x:e.x,y:e.y},r:e.height}),e.x+=e.height,e.width-=e.height)}}}return{position:t.position,r:i}}place(t){let i={},e=!1,o=null;for(let i of this.rows){for(let s of i.slots)if(s.r>=t){e=!0,o=this.fillSlot(s,t);break}if(e)break}if(!e){let i=this.addRow(),e=this.addSlot({position:{x:0,y:i.y},r:this.width});o=this.fillSlot(e,t)}for(let t=0;t<o.r;t++)for(let e=0;e<o.r;e++)this.setTxMapCell({x:o.position.x+t,y:o.position.y+e},i);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,i){let e=t.y-this.rowOffset;if(e>=0&&e<this.height&&t.x>=0&&t.x<this.width){let o=e*this.width+t.x;o>=0&&o<this.txMap.length&&(this.txMap[o]=i)}}}