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