Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URLs added here will be added as <link>s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Auto Save

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                
	<input id="isAlex" type="checkbox"><label for="isAlex">Slim Model</label>
	<input id="size" type="checkbox"><label for="size">large</label><br>
	Pose:<select id="pose_select"></select><br>
	Texture:<input id="file" type="file" accept=".png"><div id="thumb"></div><br>
  <button id="rotate">rotate</button>
  <button id="reset">reset camera</button>
  <button id="execute">draw</button><br>
  <div id="background">
	<canvas id="myCanvas" ></canvas>
  </div>
	<img id="steve" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAdVBMVEUAAACqclmbY0kApKQElZWQWT8FiIgAr6+BUzlBNZs6MYk3Nzc/KhUzJBErHg0kGAiPXj6zeV4Af38oKChGOqU/Pz9KSkoKvLwDenpqQDBJJRAAaGgAzMz///9CHQp3QjVSPYl2SzO3g2s0JRJVVVUmGgqUYD6FZw01AAAAAXRSTlMAQObYZgAAAsZJREFUeF7tlueS4jAQhHdGwTmQN4aL7/+I1z2WjoNiy4b9eduSrRFFfzUjGay7rL7v0Lu+TLq7Vn3XohPwDboFADNb+GYKVwPo7nDdDuinIsJUwvWAjmvYt20ZSiiM1wO4BtBYWrtlFzquY1+Oj1A5LjfSOfDeQiBg0nHoLOrnAfzi0HXo8LMNxKG3/LxdVHvPm66+r0R/2LzlhmIEdRZgGaMEldVKRNRcUxlWyIIS0IIO8vIu+v4igwY40QYDzQOY7KCQyMODCKPB8h8GQuYXceiHoGP5O4yPb2+vCMpRAz4koF8CKAP8SuPr4yv2P2CigY/jL2jhr7KGmmazyfNnAULluU7KhqIonIrIRcBm0zR/ARogvQgQwD/MYBZwAGA+g49LcCzhPIOqqqvtdltjqBDUHkKiquKKKXYYYIXZYVhDnBwB9RGwhXyMvii8CO+M6SyyH4CnpzXCIyAZqwyI9/fRwcIbYxI8u9mdJ4CwywD0eyibGDu6cK2TniCOJwCWQUIN0RSdAWICeEJUNbCZMDnNAJ0QXkw7OmeAVIIlJCKKJoCoQKcAKI8RYspY+JhjTukiwgDoRwCUAXkXItN2zjM2gCPAZIWcZFCbkRhEkI8e3VkSFiGAPzJ/A+gZYL+vk/YmuIwBo6fohj8y/0w4ATQ7uH7SumO442bYekbYGKAiBNsJoBNA/wU0zY7GXWNRkx5pbEuM07qAhTs8dNpeMrj7L/Wlw6TCQQWCc8OXvjT7suU7SUSU8U0HDgKCinwig0Mh0GcycEEXlZDPC1V+W1drKL/aqXlAdtYAQfY6zwTnlgFqAqojwCcz+vIMDIAonwey0v9B1hH40XkhUMpmCrMZ0AxZBozh0XQ0MF1XAkRAsmNQWb6IEAHBACYbFjxE6UlItVjtZp8FXD4vZD/tM4DL5wUDaAboPOD8vKAhH6vEhnPDH6nNQp4lz7TwAAAAAElFTkSuQmCC" style="display:none" />
  <img id="alex" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAZlBMVEUAAACMvorrmD/ljT97snhkQSzr0LCGuYTv2r/fxKLUt4/egS5xq258Vz5YWFhyTjZPT09sRi7zqFhcOyc2NjaUyJKUlmsrVCiAglo/Pz9lZWUYOBYoKCj////vu7EjYiRvb291UDi5dsVVAAAAAXRSTlMAQObYZgAAAwBJREFUeF7tludy2zAQhHOo7E29uOT9XzK7AGiTGscGnZ/xUgApzux3h9NAuF+ztNI1Lq1VjY9Sv7ZKQXUN5/cB00RzzETpzQBdx8iYNZ+2ZzBBmCJHbwcwrMICyqoGg4DtRZw0CGVZVhUg2zNA/qxjWTqoLLONTJyhCdD4aExcCt5z6IzIwanDFGbmwbcqvMyp/hwO66ddYTAhYjIADKd0ILjCuUDQIXigfF1MrWNo9/RSFC9PLoZWwYxMvgYwNApfzCr1W03qSWUAuPuS//m5wCLKSU+1qpkARkYRdV1VpUsMxzrCrrkrkBsAOWqg/f5+n6HiWRmlm6TZICKI8RfA/b7fvwM895Rqmh20BrjqQ8But87gXJEAP5WRAeKsMjhjQ2EVCfB5Bl7E2L611jaNhwTyZxSzOjfvMl6S4sMCYI2xY9uOFtrtrBVjxB8L54oAMLPdc3D2HAtAP449/G0PAJ8AMN4cC/jp5jeRgxwOmDmFscygpRX+diQJAHgEBPq9wYCZ13mlBWCkHZQegB0GPMFBLwAh5AFyQWWQcwtA13V2hN120PXaIWcazMGLJ4XPRBRBRHDjLABXmLorzVEwMShNABjeDRFFItC/AgTja/B2l2G4wASLNDShHiKwy2cAmrpkHrpuuN1uJ9ZfGjEnfAGDV5MArMNDBjAlc8fRGNOc4ATnxGfcqVvyE7CuwUDX65V2ggbxBuWXcBkvlBHc590eCEvA/nIZuP7hctnvMYQ++xuy4AAiUW8liL9Cln6UzkhK628ReDqAA30vAx6s/6RJrQxH6px0zAHA/1/rRzzuV4etEln+iWxvOJSWym0B7B6O+0kjg62AZQaTbMjAUm0fj3sjkNdKknQ2oO2hcUQm3gsAXmJfkAcY+7FN6u2iM8CVAYhtAlaAGRof+4J4Pwbh+8cAetl2UCXlksqMDB76hSE2BEkuAxCOufd+oYuH6aycDOha9AubATQNi34BC8gHPPYLFAD5NXjsFyjWfl5Exq+Q+gVo7hfYEXyWwR/uMURd56PUtQAAAABJRU5ErkJggg==" style="display:none" />
	<img id="drawed">

              
            
!

CSS

              
                
		body {
			background-color: white;
		}

		#background {
			background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAAAAABX3VL4AAAADklEQVQIHWPYXc9QvxsAB2ICdaBJUyUAAAAASUVORK5CYII=);
			background-size: 12px 12px;
			image-rendering: pixelated;
			-ms-interpolation-mode: nearest-neighbor;
			display: inline-block;
      line-height: 1px;
		}

#myCanvas {
  cursor: all-scroll;
  filter: drop-shadow(0 0 0.5rem rgba(0,0,0,0.6));
}
              
            
!

JS

              
                var main_object;
var models;
var camera;
var loader;
var controls;
var texture_changed = false
var tex_canvas

$(function () {

	const width = 400 * 1;
	const height = 636 * 1;
	const zoom = 0.91

	// initialize renderer -------------------------------------------------------------------------
	const renderer = new THREE.WebGLRenderer({
		canvas: document.querySelector('#myCanvas'),
		antialias: false,
		alpha: true,
		preserveDrawingBuffer: true
	});
	renderer.setClearColor(0xFF00FF, 0);
	renderer.setPixelRatio(window.devicePixelRatio);
	renderer.setSize(width, height);
  
	Object.keys(animations).forEach( key => {
		$("#pose_select").append(
			$("<option/>", {value: key, text: key})
		)
	})

	$("#pose_select option[value='default_pose']").prop("selected", true)

	$("#pose_select").change( function(){
		set_pose( $("#pose_select option:selected").val() )
	})

	$("#execute").on("click", function () {
		let img = document.querySelector("#drawed");
		img.src = renderer.domElement.toDataURL('image/png');
	});
  
	$("#reset").on("click", function(){
		controls.reset()
    main_object.rotation.y = 0
	});
  
  $("#rotate").on("click", function(){
    main_object.rotation.y = (main_object.rotation.y + 0.7853981633974483) % 6.283185307179586
  })

	$("#size").change(function () {

		let canvas = document.querySelector("#myCanvas");
		let pose = $("#animation option:selected").val() * 1;
		let mag = $("#size").prop("checked") ? 3.0 : 1.0;
		let w = Math.floor(400 * mag);
		let h = Math.floor(636 * mag);

		controls.reset();
		
		let aspectRatio = w / h, viewSize = 268.2;

		canvas.width = w;
		canvas.height = h;
		renderer.setSize(w, h);
		
		camera.left = -aspectRatio * viewSize / 2;
		camera.right = aspectRatio * viewSize / 2;
		camera.top = viewSize / 2;
		camera.bottom = -viewSize / 2;

		camera.updateProjectionMatrix();
		controls.saveState();
	})

	// Input Skin image
	$("#file").change( function(e) {
		let files = e.currentTarget.files

		let onload = async function(){
			//change texture
			let canvas = document.querySelector("#canvas");
			let context = canvas.getContext("2d")
			
			context.clearRect(0, 0, 64, 64);
			context.drawImage(this, 0, 0);
			if(this.height < 64){
				convert64(context, this)
			}

			loader.materials[0].map.image = canvas
			loader.materials[0].map.needsUpdate = true;

      // for translucent overlay
			let material2 = loader.materials[0].clone();
			let alpha = await createAlphaMap(canvas, 1, BBModelLoader.alphaByAlpha);
			material2.alphaMap = alpha;
			material2.transparent = true;
			loader.materials[1] = material2;
      
      texture_changed = true
		}
		
		if(files.length && files[0].type.match('image.*')){
			let fileRdr = new FileReader();
			fileRdr.self = this;
			fileRdr.onload = function(){
				let img = new Image()
				img.onload = onload;
				img.src = this.result
			}
			fileRdr.readAsDataURL(files[0])
		}
	})

	// Change model Steve or Alex
	$("#isAlex").change(function(){
    
    if(!texture_changed){
        let tex = document.querySelector($(this).prop("checked") ? "#alex": "#steve")
			  tex_canvas.context.clearRect(0, 0, 64, 64);
        tex_canvas.context.drawImage(tex, 0, 0)
        loader.materials[0].map.needsUpdate = true
    }

		// Pixel to UVworld mapping
		let setUVS = function (mesh, uvs, overlay){
			for(let i=0; i<mesh.geometry.faceVertexUvs[0].length; i++){
				let face = mesh.geometry.faceVertexUvs[0][i]
				for(let j=0; j<3; j++){
					face[j].x = (uvs[i][j].x + (overlay==2 ? 16: 0)) / 64
					face[j].y = (uvs[i][j].y - (overlay==1 ? 16: 0)) / 64
					face[j].z = (uvs[i][j].z + (overlay==2 ? 16: 0)) / 64
				}
			}
			mesh.geometry.uvsNeedUpdate = true
		}

		let checked = $("#isAlex").prop("checked")
		if(checked){
			// change arm models
			models.leftArm.children[0].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 1.5
				vertex.y = Math.sign(vertex.y) * 6
				vertex.z = Math.sign(vertex.z) * 2
			})
			models.leftArm.children[0].children[0].geometry.verticesNeedUpdate = true

			models.leftArm.children[1].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 1.7
				vertex.y = Math.sign(vertex.y) * 6.2
				vertex.z = Math.sign(vertex.z) * 2.2
			})
			models.leftArm.children[1].children[0].geometry.verticesNeedUpdate = true

			models.rightArm.children[0].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 1.5
				vertex.y = Math.sign(vertex.y) * 6
				vertex.z = Math.sign(vertex.z) * 2
			})
			models.rightArm.children[0].children[0].geometry.verticesNeedUpdate = true

			models.rightArm.children[1].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 1.7
				vertex.y = Math.sign(vertex.y) * 6.2
				vertex.z = Math.sign(vertex.z) * 2.2
			})
			models.rightArm.children[1].children[0].geometry.verticesNeedUpdate = true

			// adjust arm positions
			models.leftArm.children[0].children[0].position.set(-5.5, 18.5, 0)
			models.rightArm.children[0].children[0].position.set(5.5, 18.5, 0)

			models.leftArm.children[1].children[0].position.set(-5.5, 18.5, 0)
			models.rightArm.children[1].children[0].position.set(5.5, 18.5, 0)

			models.leftArm.children[0].position.y = -22.5
			models.rightArm.children[0].position.y = -22.5

			models.leftArm.children[1].position.y = -22.5
			models.rightArm.children[1].position.y = -22.5

			models.leftArm.position.y = 21.5
			models.rightArm.position.y = 21.5

			// Alex UV offsets
			let uvs = [
				[
					[{ x: 47, y: 32 }, { x: 51, y: 32 }, { x: 47, y: 44 }],
					[{ x: 51, y: 44 }, { x: 47, y: 44 }, { x: 51, y: 32 }],
					[{ x: 44, y: 44 }, { x: 40, y: 32 }, { x: 44, y: 32 }],
					[{ x: 40, y: 32 }, { x: 44, y: 44 }, { x: 40, y: 44 }],
					[{ x: 44, y: 44 }, { x: 47, y: 48 }, { x: 44, y: 48 }],
					[{ x: 47, y: 48 }, { x: 44, y: 44 }, { x: 47, y: 44 }],
					[{ x: 47, y: 48 }, { x: 50, y: 48 }, { x: 47, y: 44 }],
					[{ x: 50, y: 44 }, { x: 47, y: 44 }, { x: 50, y: 48 }],
					[{ x: 44, y: 32 }, { x: 47, y: 32 }, { x: 44, y: 44 }],
					[{ x: 47, y: 44 }, { x: 44, y: 44 }, { x: 47, y: 32 }],
					[{ x: 54, y: 44 }, { x: 51, y: 32 }, { x: 54, y: 32 }],
					[{ x: 51, y: 32 }, { x: 54, y: 44 }, { x: 51, y: 44 }],
				],
				[
					[{ x: 39, y: 0 }, { x: 43, y: 0 }, { x: 39, y: 12 }],
					[{ x: 43, y: 12 }, { x: 39, y: 12 }, { x: 43, y: 0 }],
					[{ x: 36, y: 12 }, { x: 32, y: 0 }, { x: 36, y: 0 }],
					[{ x: 32, y: 0 }, { x: 36, y: 12 }, { x: 32, y: 12 }],
					[{ x: 36, y: 12 }, { x: 39, y: 16 }, { x: 36, y: 16 }],
					[{ x: 39, y: 16 }, { x: 36, y: 12 }, { x: 39, y: 12 }],
					[{ x: 39, y: 16 }, { x: 42, y: 16 }, { x: 39, y: 12 }],
					[{ x: 42, y: 12 }, { x: 39, y: 12 }, { x: 42, y: 16 }],
					[{ x: 36, y: 0 }, { x: 39, y: 0 }, { x: 36, y: 12 }],
					[{ x: 39, y: 12 }, { x: 36, y: 12 }, { x: 39, y: 0 }],
					[{ x: 46, y: 12 }, { x: 43, y: 0 }, { x: 46, y: 0 }],
					[{ x: 43, y: 0 }, { x: 46, y: 12 }, { x: 43, y: 12 }],
				],
			]

			setUVS(models.leftArm.children[0].children[0], uvs[0])
			setUVS(models.leftArm.children[1].children[0], uvs[0], 1)

			setUVS(models.rightArm.children[0].children[0], uvs[1])
			setUVS(models.rightArm.children[1].children[0], uvs[1], 2)

		} else {
			// change arm models
			models.leftArm.children[0].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 2
				vertex.y = Math.sign(vertex.y) * 6
				vertex.z = Math.sign(vertex.z) * 2
			})
			models.leftArm.children[0].children[0].geometry.verticesNeedUpdate = true

			models.leftArm.children[1].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 2.2
				vertex.y = Math.sign(vertex.y) * 6.2
				vertex.z = Math.sign(vertex.z) * 2.2
			})
			models.leftArm.children[1].children[0].geometry.verticesNeedUpdate = true

			models.rightArm.children[0].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 2
				vertex.y = Math.sign(vertex.y) * 6
				vertex.z = Math.sign(vertex.z) * 2
			})
			models.rightArm.children[0].children[0].geometry.verticesNeedUpdate = true

			models.rightArm.children[1].children[0].geometry.vertices.forEach(vertex => {
				vertex.x = Math.sign(vertex.x) * 2.2
				vertex.y = Math.sign(vertex.y) * 6.2
				vertex.z = Math.sign(vertex.z) * 2.2
			})
			models.rightArm.children[1].children[0].geometry.verticesNeedUpdate = true

			// adjust arm positions
			models.leftArm.children[0].children[0].position.set(-6, 18, 0)
			models.rightArm.children[0].children[0].position.set(6, 18, 0)

			models.leftArm.children[1].children[0].position.set(-6, 18, 0)
			models.rightArm.children[1].children[0].position.set(6, 18, 0)

			models.leftArm.children[0].position.y = -22
			models.rightArm.children[0].position.y = -22

			models.leftArm.children[1].position.y = -22
			models.rightArm.children[1].position.y = -22

			models.leftArm.position.y = 22
			models.rightArm.position.y = 22

			// Steve UV offsets
			let uvs = [
				[
					[{ x: 48, y: 32 }, { x: 52, y: 32 }, { x: 48, y: 44 },],
					[{ x: 52, y: 44 }, { x: 48, y: 44 }, { x: 52, y: 32 },],
					[{ x: 44, y: 44 }, { x: 40, y: 32 }, { x: 44, y: 32 },],
					[{ x: 40, y: 32 }, { x: 44, y: 44 }, { x: 40, y: 44 },],
					[{ x: 44, y: 44 }, { x: 48, y: 48 }, { x: 44, y: 48 },],
					[{ x: 48, y: 48 }, { x: 44, y: 44 }, { x: 48, y: 44 },],
					[{ x: 48, y: 48 }, { x: 52, y: 48 }, { x: 48, y: 44 },],
					[{ x: 52, y: 44 }, { x: 48, y: 44 }, { x: 52, y: 48 },],
					[{ x: 44, y: 32 }, { x: 48, y: 32 }, { x: 44, y: 44 },],
					[{ x: 48, y: 44 }, { x: 44, y: 44 }, { x: 48, y: 32 },],
					[{ x: 56, y: 44 }, { x: 52, y: 32 }, { x: 56, y: 32 },],
					[{ x: 52, y: 32 }, { x: 56, y: 44 }, { x: 52, y: 44 },],
				],
				[
					[{ x: 40, y: 0 }, { x: 44, y: 0 }, { x: 40, y: 12 },],
					[{ x: 44, y: 12 }, { x: 40, y: 12 }, { x: 44, y: 0 },],
					[{ x: 36, y: 12 }, { x: 32, y: 0 }, { x: 36, y: 0 },],
					[{ x: 32, y: 0 }, { x: 36, y: 12 }, { x: 32, y: 12 },],
					[{ x: 36, y: 12 }, { x: 40, y: 16 }, { x: 36, y: 16 },],
					[{ x: 40, y: 16 }, { x: 36, y: 12 }, { x: 40, y: 12 },],
					[{ x: 40, y: 16 }, { x: 44, y: 16 }, { x: 40, y: 12 },],
					[{ x: 44, y: 12 }, { x: 40, y: 12 }, { x: 44, y: 16 },],
					[{ x: 36, y: 0 }, { x: 40, y: 0 }, { x: 36, y: 12 },],
					[{ x: 40, y: 12 }, { x: 36, y: 12 }, { x: 40, y: 0 },],
					[{ x: 48, y: 12 }, { x: 44, y: 0 }, { x: 48, y: 0 },],
					[{ x: 44, y: 0 }, { x: 48, y: 12 }, { x: 44, y: 12 },],
				]
			]

			setUVS(models.leftArm.children[0].children[0], uvs[0])
			setUVS(models.leftArm.children[1].children[0], uvs[0], 1)

			setUVS(models.rightArm.children[0].children[0], uvs[1])
			setUVS(models.rightArm.children[1].children[0], uvs[1], 2)
		}
	});
  
  
  // convert 64x32 to 64x64
  let convert64 = function(context, img){
    let m = val => Math.floor(val * (img.width / 64))
    
    context.translate(img.width, 0);
    context.scale(-1, 1);
    context.drawImage(img, m(4), m(16), m(4), m(4), m(40), m(48), m(4), m(4))
    context.drawImage(img, m(8), m(16), m(4), m(4), m(36), m(48), m(4), m(4))
    context.drawImage(img, m(0), m(20), m(4),  m(12), m(44), m(52), m(4), m(12))
    context.drawImage(img, m(4), m(20), m(4),  m(12), m(40), m(52), m(4), m(12))
    context.drawImage(img, m(8), m(20), m(4),  m(12), m(36), m(52), m(4), m(12))
    context.drawImage(img, m(12), m(20), m(4), m(12), m(32), m(52), m(4), m(12))

    context.drawImage(img, m(44), m(16), m(4), m(4), m(24), m(48), m(4), m(4))
    context.drawImage(img, m(48), m(16), m(4), m(4), m(20), m(48), m(4), m(4))
    context.drawImage(img, m(40), m(20), m(4), m(12), m(28), m(52), m(4), m(12))
    context.drawImage(img, m(44), m(20), m(4), m(12), m(24), m(52), m(4), m(12))
    context.drawImage(img, m(48), m(20), m(4), m(12), m(20), m(52), m(4), m(12))
    context.drawImage(img, m(52), m(20), m(4), m(12), m(16), m(52), m(4), m(12))

    context.restore(0, 0);
    context.resetTransform();
  }

	// initilaize scene
	const scene = new THREE.Scene();

	let pos_x = 0, pos_y = -144, pos_z = 0;
	

	let img = document.querySelector("#steve")
  
  let temp = img.src
  img.src = ""
  img.src = temp
  img.onload = function(){
    
	  let canvas = createCanvas(64, 64);
    canvas.context.drawImage(img, 0, 0)
    canvas.canvas.setAttribute("id", "canvas")
    $(canvas.canvas).appendTo("#thumb")
    tex_canvas = canvas


    if(img.height < 64){
      convert64(canvas.context, img)
    }

    loader = new BBModelLoader({
      filename: json_url,
      texture_name: ["#canvas"],
      side: THREE.DoubleSide,
    }).loadEntity(function(object, parts){
      main_object = object;
      models = parts;

      /// for translucent overlay
			let material2 = loader.materials[0].clone();
			loader.materials[1] = material2;
			Object.keys(loader.parts).forEach(key => {
				let mesh = loader.parts[key].children[1].children[0];
				let geo = loader.parts[key].children[1].children[0].geometry;
				mesh.material = loader.materials;
				geo.faces.forEach( face => {
					face.materialIndex = 1;
				});
			});
      
      object.scale.set(8.5, 8.5, 8.5);
      object.position.set(pos_x, pos_y, pos_z);

      scene.add(object);
      Render(scene);
    });
  }
	
	function Render(scene) {

		// initilalize camera
		var viewSize = 268.2;

		var aspectRatio = width / height;
		camera = new THREE.OrthographicCamera(
			-aspectRatio * viewSize / 2,
			aspectRatio * viewSize / 2,
			viewSize / 2,
			-viewSize / 2,
			-1000,
			1000
		);

		camera.position.set(viewSize, viewSize * 0.8168, viewSize); // Isometric position
		camera.lookAt(scene.position);
		camera.zoom = zoom;
		camera.updateProjectionMatrix();
		controls = new THREE.OrbitControls(camera, renderer.domElement);
		controls.enableKeys = false;

		// Lighting -------------------------------------------------------------------------------------

		const dirLight = new THREE.DirectionalLight(0xFFFFFF);
		//dirLight.intensity = 0.435;
		dirLight.intensity = 0.45;
		dirLight.position.set(-1.25, 4.25, 1.24).normalize();
		dirLight.castShadow = true;
		dirLight.shadow.mapSize.width = 2048;
		dirLight.shadow.mapSize.height = 2048;
		var d = 50;
		dirLight.shadow.camera.left = -d;
		dirLight.shadow.camera.right = d;
		dirLight.shadow.camera.top = d;
		dirLight.shadow.camera.bottom = -d;
		dirLight.shadow.camera.far = 3500;
		dirLight.shadow.bias = -0.0001;
		scene.add(dirLight);
		var ambientLight = new THREE.AmbientLight(0xFCFCFF);
		ambientLight.intensity = 0.618;
		scene.add(ambientLight);

		// Run tick -------------------------------------------------------------------------------------
		
		tick();

		function tick() {

			// Rendering
			renderer.render(scene, camera);
			requestAnimationFrame(tick);
		}
	}
});


function set_pose(pose_name){

	let setrotation = (parts, values) => {
		parts.rotation.set(0, 0, 0)
		let axis = new THREE.Vector3(1, 0, 0);
		parts.rotateOnWorldAxis(axis, deg2rad(values[0]));
		axis.set(0, 1, 0);
		parts.rotateOnWorldAxis(axis, deg2rad(values[1]));
		axis.set(0, 0, 1);
		parts.rotateOnWorldAxis(axis, deg2rad(values[2]));
	}

	if(animations.hasOwnProperty(pose_name)){

		pose = animations[pose_name]

		setrotation(models.head, pose.bones.head.rotation)
		setrotation(models.body, pose.bones.body.rotation)
		setrotation(models.rightArm, pose.bones.leftarm.rotation)
		setrotation(models.leftArm, pose.bones.rightarm.rotation)
		setrotation(models.rightLeg, pose.bones.leftleg.rotation)
		setrotation(models.leftLeg, pose.bones.rightleg.rotation)
	}
	
}

let animations = 
{
	"default_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 0, 0, 5 ]
			},
			"leftleg" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightarm" : {
				"rotation" : [ 0, 0, -5 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 0, 0, 0 ]
			}
		}
	},
	"no_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"leftleg" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightarm" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 0, 0, 0 ]
			}
		}
	},
	"default_armor_stand_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ -1, -7, 0 ]
			},
			"leftarm" : {
				"rotation" : [ -10, 0, 10 ]
			},
			"leftleg" : {
				"rotation" : [ -1, 0, 1 ]
			},
			"rightarm" : {
				"rotation" : [ -15, 0, -10 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 1, 0, -1 ]
			}
		}
	},
	"solemn_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, -2 ]
			},
			"head" : {
				"rotation" : [ 15, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ -30, -15, -15 ]
			},
			"leftleg" : {
				"rotation" : [ -1, 0, 1 ]
			},
			"rightarm" : {
				"rotation" : [ -60, 20, 10 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 1, 0, -1 ]
			}
		}
	},
	"athena_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, -2 ]
			},
			"head" : {
				"rotation" : [ -5, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 10, 0, 5 ]
			},
			"leftleg" : {
				"rotation" : [ -3, 3, 3 ]
			},
			"rightarm" : {
				"rotation" : [ -60, -20, 10 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 3, -3, -3 ]
			}
		}
	},
	"brandish_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 2 ]
			},
			"head" : {
				"rotation" : [ -15, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 20, 0, 10 ]
			},
			"leftleg" : {
				"rotation" : [ 5, 3, 3 ]
			},
			"rightarm" : {
				"rotation" : [ -110, -50, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ -5, -3, -3 ]
			}
		}
	},
	"honor_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ -15, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ -110, -35, 0 ]
			},
			"leftleg" : {
				"rotation" : [ 5, 3, 3 ]
			},
			"rightarm" : {
				"rotation" : [ -110, 35, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ -5, -3, -3 ]
			}
		}
	},
	"entertain_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ -15, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ -110, 35, 0 ]
			},
			"leftleg" : {
				"rotation" : [ 5, 3, 3 ]
			},
			"rightarm" : {
				"rotation" : [ -110, -35, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ -5, -3, -3 ]
			}
		}
	},
	"salute_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 10, 0, 5 ]
			},
			"leftleg" : {
				"rotation" : [ -1, 0, 1 ]
			},
			"rightarm" : {
				"rotation" : [ -70, 40, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 1, 0, -1 ]
			}
		}
	},
	"hero_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, -8, 0 ]
			},
			"head" : {
				"rotation" : [ -4, -67, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 16, -32, 8 ]
			},
			"leftleg" : {
				"rotation" : [ 0, 75, 8 ]
			},
			"rightarm" : {
				"rotation" : [ -99, -63, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 4, -63, -8 ]
			}
		}
	},
	"riposte_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ 16, -20, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 4, -8, -237 ]
			},
			"leftleg" : {
				"rotation" : [ -14, 18, 16 ]
			},
			"rightarm" : {
				"rotation" : [ 246, 0, -89 ]
			},
			"rightitem" : {
				"rotation" : [ 0, -180, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 8, -20, -4 ]
			}
		}
	},
	/*
	"wiggle" : {
		"loop" : true,
		"bones" : {
			"baseplate" : {
				"rotation" : [ 0.0, "math.sin((variable.armor_stand.hurt_time query.frame_alpha) * 120) * 3", 0.0 ]
			}
		}
	},*/
	"zombie_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"head" : {
				"rotation" : [ -10, 0, 5 ]
			},
			"leftarm" : {
				"rotation" : [ -105, 0, 0 ]
			},
			"leftleg" : {
				"rotation" : [ 7, 0, 0 ]
			},
			"rightarm" : {
				"rotation" : [ -100, 0, 0 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ -46, 0, 0 ]
			}
		}
	},
	"cancan_a_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, -22, 0 ]
			},
			"head" : {
				"rotation" : [ -5, -18, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 8, 0, 114 ]
			},
			"leftleg" : {
				"rotation" : [ -111, -55, 0 ]
			},
			"rightarm" : {
				"rotation" : [ 0, -84, -111 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ 0, -23, 13 ]
			}
		}
	},
	"cancan_b_pose" : {
		"loop" : true,
		"bones" : {
			"body" : {
				"rotation" : [ 0, 18, 0 ]
			},
			"head" : {
				"rotation" : [ -10, 20, 0 ]
			},
			"leftarm" : {
				"rotation" : [ 0, 0, 112 ]
			},
			"leftleg" : {
				"rotation" : [ 0, 0, -13 ]
			},
			"rightarm" : {
				"rotation" : [ 8, -90, -111 ]
			},
			"rightitem" : {
				"rotation" : [ 0, 0, 0 ]
			},
			"rightleg" : {
				"rotation" : [ -119, 42, 0 ]
			}
		}
	},
}

var json_url = "data:application/json;base64,eyJtZXRhIjp7ImZvcm1hdF92ZXJzaW9uIjoiNC4wIiwibW9kZWxfZm9ybWF0IjoiYmVkcm9jayIsImJveF91diI6dHJ1ZX0sIm5hbWUiOiJodW1hbm9pZCIsInZpc2libGVfYm94IjpbMSwxLDBdLCJyZXNvbHV0aW9uIjp7IndpZHRoIjo2NCwiaGVpZ2h0Ijo2NH0sImVsZW1lbnRzIjpbeyJuYW1lIjoiaGVhZCIsImZyb20iOlstNCwyNCwtNF0sInRvIjpbNCwzMiw0XSwiYXV0b3V2IjowLCJjb2xvciI6Niwib3JpZ2luIjpbMCwwLDBdLCJmYWNlcyI6eyJub3J0aCI6eyJ1diI6WzgsOCwxNiwxNl0sInRleHR1cmUiOjB9LCJlYXN0Ijp7InV2IjpbMCw4LDgsMTZdLCJ0ZXh0dXJlIjowfSwic291dGgiOnsidXYiOlsyNCw4LDMyLDE2XSwidGV4dHVyZSI6MH0sIndlc3QiOnsidXYiOlsxNiw4LDI0LDE2XSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbMTYsOCw4LDBdLCJ0ZXh0dXJlIjowfSwiZG93biI6eyJ1diI6WzI0LDAsMTYsOF0sInRleHR1cmUiOjB9fSwidHlwZSI6ImN1YmUiLCJ1dWlkIjoiOTM1NWJjYjctM2Q0Yi0zYzVhLTI4ZTgtYzNiN2U1ZDkwN2Y4In0seyJuYW1lIjoiYm9keSIsImZyb20iOlstNCwxMiwtMl0sInRvIjpbNCwyNCwyXSwiYXV0b3V2IjowLCJjb2xvciI6NSwib3JpZ2luIjpbMCwwLDBdLCJ1dl9vZmZzZXQiOlsxNiwxNl0sImZhY2VzIjp7Im5vcnRoIjp7InV2IjpbMjAsMjAsMjgsMzJdLCJ0ZXh0dXJlIjowfSwiZWFzdCI6eyJ1diI6WzE2LDIwLDIwLDMyXSwidGV4dHVyZSI6MH0sInNvdXRoIjp7InV2IjpbMzIsMjAsNDAsMzJdLCJ0ZXh0dXJlIjowfSwid2VzdCI6eyJ1diI6WzI4LDIwLDMyLDMyXSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbMjgsMjAsMjAsMTZdLCJ0ZXh0dXJlIjowfSwiZG93biI6eyJ1diI6WzM2LDE2LDI4LDIwXSwidGV4dHVyZSI6MH19LCJ0eXBlIjoiY3ViZSIsInV1aWQiOiJmODcxMzc1MC0xZmQwLTY4YjctYTE2NC03OGEzZGUxMjJhZWUifSx7Im5hbWUiOiJsZWZ0QXJtIiwiZnJvbSI6WzQsMTIsLTJdLCJ0byI6WzgsMjQsMl0sImF1dG91diI6MCwiY29sb3IiOjMsIm9yaWdpbiI6WzAsMCwwXSwidXZfb2Zmc2V0IjpbNDAsMTZdLCJmYWNlcyI6eyJub3J0aCI6eyJ1diI6WzQ0LDIwLDQ4LDMyXSwidGV4dHVyZSI6MH0sImVhc3QiOnsidXYiOls0MCwyMCw0NCwzMl0sInRleHR1cmUiOjB9LCJzb3V0aCI6eyJ1diI6WzUyLDIwLDU2LDMyXSwidGV4dHVyZSI6MH0sIndlc3QiOnsidXYiOls0OCwyMCw1MiwzMl0sInRleHR1cmUiOjB9LCJ1cCI6eyJ1diI6WzQ4LDIwLDQ0LDE2XSwidGV4dHVyZSI6MH0sImRvd24iOnsidXYiOls1MiwxNiw0OCwyMF0sInRleHR1cmUiOjB9fSwidHlwZSI6ImN1YmUiLCJ1dWlkIjoiNDZmMjFkNmQtZmUyOC00NGI2LWViOTMtZjE5MTI3MzdjYTMwIn0seyJuYW1lIjoicmlnaHRBcm0iLCJmcm9tIjpbLTgsMTIsLTJdLCJ0byI6Wy00LDI0LDJdLCJhdXRvdXYiOjAsImNvbG9yIjo1LCJvcmlnaW4iOlswLDAsMF0sInV2X29mZnNldCI6WzMyLDQ4XSwiZmFjZXMiOnsibm9ydGgiOnsidXYiOlszNiw1Miw0MCw2NF0sInRleHR1cmUiOjB9LCJlYXN0Ijp7InV2IjpbMzIsNTIsMzYsNjRdLCJ0ZXh0dXJlIjowfSwic291dGgiOnsidXYiOls0NCw1Miw0OCw2NF0sInRleHR1cmUiOjB9LCJ3ZXN0Ijp7InV2IjpbNDAsNTIsNDQsNjRdLCJ0ZXh0dXJlIjowfSwidXAiOnsidXYiOls0MCw1MiwzNiw0OF0sInRleHR1cmUiOjB9LCJkb3duIjp7InV2IjpbNDQsNDgsNDAsNTJdLCJ0ZXh0dXJlIjowfX0sInR5cGUiOiJjdWJlIiwidXVpZCI6IjdlODZlY2Q1LWE2N2ItMDFmNy00ZTAzLTlmOTAzOGEwMDkxOCJ9LHsibmFtZSI6ImxlZnRMZWciLCJmcm9tIjpbLTAuMSwwLC0yXSwidG8iOlszLjksMTIsMl0sImF1dG91diI6MCwiY29sb3IiOjQsIm9yaWdpbiI6WzAsMCwwXSwidXZfb2Zmc2V0IjpbMCwxNl0sImZhY2VzIjp7Im5vcnRoIjp7InV2IjpbNCwyMCw4LDMyXSwidGV4dHVyZSI6MH0sImVhc3QiOnsidXYiOlswLDIwLDQsMzJdLCJ0ZXh0dXJlIjowfSwic291dGgiOnsidXYiOlsxMiwyMCwxNiwzMl0sInRleHR1cmUiOjB9LCJ3ZXN0Ijp7InV2IjpbOCwyMCwxMiwzMl0sInRleHR1cmUiOjB9LCJ1cCI6eyJ1diI6WzgsMjAsNCwxNl0sInRleHR1cmUiOjB9LCJkb3duIjp7InV2IjpbMTIsMTYsOCwyMF0sInRleHR1cmUiOjB9fSwidHlwZSI6ImN1YmUiLCJ1dWlkIjoiZThmNzRiMDgtNTEwYi0yMmYxLWNlYzEtZGM2ZmM3NjQxOTBmIn0seyJuYW1lIjoicmlnaHRMZWciLCJmcm9tIjpbLTMuOSwwLC0yXSwidG8iOlswLjEsMTIsMl0sIm9yaWdpbiI6WzAsMCwwXSwidXZfb2Zmc2V0IjpbMTYsNDhdLCJmYWNlcyI6eyJub3J0aCI6eyJ1diI6WzIwLDUyLDI0LDY0XSwidGV4dHVyZSI6MH0sImVhc3QiOnsidXYiOlsxNiw1MiwyMCw2NF0sInRleHR1cmUiOjB9LCJzb3V0aCI6eyJ1diI6WzI4LDUyLDMyLDY0XSwidGV4dHVyZSI6MH0sIndlc3QiOnsidXYiOlsyNCw1MiwyOCw2NF0sInRleHR1cmUiOjB9LCJ1cCI6eyJ1diI6WzI0LDUyLDIwLDQ4XSwidGV4dHVyZSI6MH0sImRvd24iOnsidXYiOlsyOCw0OCwyNCw1Ml0sInRleHR1cmUiOjB9fSwidHlwZSI6ImN1YmUiLCJ1dWlkIjoiNmJlN2E1NmEtNGZiMC02N2M4LTEzYzUtNGQyZDRmYmU1MDcwIn0seyJuYW1lIjoiaGVhZCIsImZyb20iOlstNCwyNCwtNF0sInRvIjpbNCwzMiw0XSwiaW5mbGF0ZSI6MC40LCJvcmlnaW4iOlswLDAsMF0sInV2X29mZnNldCI6WzMyLDBdLCJmYWNlcyI6eyJub3J0aCI6eyJ1diI6WzQwLDgsNDgsMTZdLCJ0ZXh0dXJlIjowfSwiZWFzdCI6eyJ1diI6WzMyLDgsNDAsMTZdLCJ0ZXh0dXJlIjowfSwic291dGgiOnsidXYiOls1Niw4LDY0LDE2XSwidGV4dHVyZSI6MH0sIndlc3QiOnsidXYiOls0OCw4LDU2LDE2XSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbNDgsOCw0MCwwXSwidGV4dHVyZSI6MH0sImRvd24iOnsidXYiOls1NiwwLDQ4LDhdLCJ0ZXh0dXJlIjowfX0sInR5cGUiOiJjdWJlIiwidXVpZCI6ImYxYTZlMjY0LTBmYzctNzgyZi1lMDAxLWRlNGZlYmQxN2QyNSJ9LHsibmFtZSI6ImJvZHkiLCJmcm9tIjpbLTQsMTIsLTJdLCJ0byI6WzQsMjQsMl0sImluZmxhdGUiOjAuNCwib3JpZ2luIjpbMCwwLDBdLCJ1dl9vZmZzZXQiOlsxNiwzMl0sImZhY2VzIjp7Im5vcnRoIjp7InV2IjpbMjAsMzYsMjgsNDhdLCJ0ZXh0dXJlIjowfSwiZWFzdCI6eyJ1diI6WzE2LDM2LDIwLDQ4XSwidGV4dHVyZSI6MH0sInNvdXRoIjp7InV2IjpbMzIsMzYsNDAsNDhdLCJ0ZXh0dXJlIjowfSwid2VzdCI6eyJ1diI6WzI4LDM2LDMyLDQ4XSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbMjgsMzYsMjAsMzJdLCJ0ZXh0dXJlIjowfSwiZG93biI6eyJ1diI6WzM2LDMyLDI4LDM2XSwidGV4dHVyZSI6MH19LCJ0eXBlIjoiY3ViZSIsInV1aWQiOiI0ZDA5MTdiYS00MjEyLWE2NGItZDRlMy0xMzkyYzY4ZjMyYjMifSx7Im5hbWUiOiJsZWZ0QXJtIiwiZnJvbSI6WzQsMTIsLTJdLCJ0byI6WzgsMjQsMl0sImluZmxhdGUiOjAuNCwib3JpZ2luIjpbMCwwLDBdLCJ1dl9vZmZzZXQiOls0MCwzMl0sImZhY2VzIjp7Im5vcnRoIjp7InV2IjpbNDQsMzYsNDgsNDhdLCJ0ZXh0dXJlIjowfSwiZWFzdCI6eyJ1diI6WzQwLDM2LDQ0LDQ4XSwidGV4dHVyZSI6MH0sInNvdXRoIjp7InV2IjpbNTIsMzYsNTYsNDhdLCJ0ZXh0dXJlIjowfSwid2VzdCI6eyJ1diI6WzQ4LDM2LDUyLDQ4XSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbNDgsMzYsNDQsMzJdLCJ0ZXh0dXJlIjowfSwiZG93biI6eyJ1diI6WzUyLDMyLDQ4LDM2XSwidGV4dHVyZSI6MH19LCJ0eXBlIjoiY3ViZSIsInV1aWQiOiJjODYyYjRiYy1jMzE2LTg2ZTQtYjIzZC0zNmM5OTU2M2QyNDgifSx7Im5hbWUiOiJyaWdodEFybSIsImZyb20iOlstOCwxMiwtMl0sInRvIjpbLTQsMjQsMl0sImluZmxhdGUiOjAuNCwib3JpZ2luIjpbMCwwLDBdLCJ1dl9vZmZzZXQiOls0OCw0OF0sImZhY2VzIjp7Im5vcnRoIjp7InV2IjpbNTIsNTIsNTYsNjRdLCJ0ZXh0dXJlIjowfSwiZWFzdCI6eyJ1diI6WzQ4LDUyLDUyLDY0XSwidGV4dHVyZSI6MH0sInNvdXRoIjp7InV2IjpbNjAsNTIsNjQsNjRdLCJ0ZXh0dXJlIjowfSwid2VzdCI6eyJ1diI6WzU2LDUyLDYwLDY0XSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbNTYsNTIsNTIsNDhdLCJ0ZXh0dXJlIjowfSwiZG93biI6eyJ1diI6WzYwLDQ4LDU2LDUyXSwidGV4dHVyZSI6MH19LCJ0eXBlIjoiY3ViZSIsInV1aWQiOiI0YTZlOWI4NS1kNjY3LWUwYTgtYzA0Ny1hZmZiNzFlYzQzYmYifSx7Im5hbWUiOiJsZWZ0TGVnIiwiZnJvbSI6Wy0wLjEsMCwtMl0sInRvIjpbMy45LDEyLDJdLCJpbmZsYXRlIjowLjQsIm9yaWdpbiI6WzAsMCwwXSwidXZfb2Zmc2V0IjpbMCwzMl0sImZhY2VzIjp7Im5vcnRoIjp7InV2IjpbNCwzNiw4LDQ4XSwidGV4dHVyZSI6MH0sImVhc3QiOnsidXYiOlswLDM2LDQsNDhdLCJ0ZXh0dXJlIjowfSwic291dGgiOnsidXYiOlsxMiwzNiwxNiw0OF0sInRleHR1cmUiOjB9LCJ3ZXN0Ijp7InV2IjpbOCwzNiwxMiw0OF0sInRleHR1cmUiOjB9LCJ1cCI6eyJ1diI6WzgsMzYsNCwzMl0sInRleHR1cmUiOjB9LCJkb3duIjp7InV2IjpbMTIsMzIsOCwzNl0sInRleHR1cmUiOjB9fSwidHlwZSI6ImN1YmUiLCJ1dWlkIjoiYTA1NWEyMjYtZTQ0Zi01MDRiLTg3MDktNTliYTkzZGViMzMxIn0seyJuYW1lIjoicmlnaHRMZWciLCJmcm9tIjpbLTMuOSwwLC0yXSwidG8iOlswLjEsMTIsMl0sImluZmxhdGUiOjAuNCwib3JpZ2luIjpbMCwwLDBdLCJ1dl9vZmZzZXQiOlswLDQ4XSwiZmFjZXMiOnsibm9ydGgiOnsidXYiOls0LDUyLDgsNjRdLCJ0ZXh0dXJlIjowfSwiZWFzdCI6eyJ1diI6WzAsNTIsNCw2NF0sInRleHR1cmUiOjB9LCJzb3V0aCI6eyJ1diI6WzEyLDUyLDE2LDY0XSwidGV4dHVyZSI6MH0sIndlc3QiOnsidXYiOls4LDUyLDEyLDY0XSwidGV4dHVyZSI6MH0sInVwIjp7InV2IjpbOCw1Miw0LDQ4XSwidGV4dHVyZSI6MH0sImRvd24iOnsidXYiOlsxMiw0OCw4LDUyXSwidGV4dHVyZSI6MH19LCJ0eXBlIjoiY3ViZSIsInV1aWQiOiI1ZWU0ODY0MS02ODkwLTg2YWItZTQ5MS00N2M5MjFmMzE3ZWIifV0sIm91dGxpbmVyIjpbeyJuYW1lIjoiaGVhZCIsIm9yaWdpbiI6WzAsMjQsMF0sInV1aWQiOiI3MDk3MWRmYS1jZDkzLTU2M2ItZDYyNS04ZDljMmI3NDJmNzUiLCJjaGlsZHJlbiI6WyI5MzU1YmNiNy0zZDRiLTNjNWEtMjhlOC1jM2I3ZTVkOTA3ZjgiLCJmMWE2ZTI2NC0wZmM3LTc4MmYtZTAwMS1kZTRmZWJkMTdkMjUiXX0seyJuYW1lIjoiYm9keSIsIm9yaWdpbiI6WzAsMjQsMF0sInV1aWQiOiI4ZGVhYTFkMC1kZTFhLTZkMWUtOWI3YS0xMjBkYTEyZjkyMTEiLCJjaGlsZHJlbiI6WyJmODcxMzc1MC0xZmQwLTY4YjctYTE2NC03OGEzZGUxMjJhZWUiLCI0ZDA5MTdiYS00MjEyLWE2NGItZDRlMy0xMzkyYzY4ZjMyYjMiXX0seyJuYW1lIjoibGVmdEFybSIsIm9yaWdpbiI6WzUsMjIsMF0sInJvdGF0aW9uIjpbMCwwLDVdLCJ1dWlkIjoiN2MzZTk3YjUtOTcyMi1iOGUwLTkwODktNmFiNjhiMTBmMWM4IiwiY2hpbGRyZW4iOlsiNDZmMjFkNmQtZmUyOC00NGI2LWViOTMtZjE5MTI3MzdjYTMwIiwiYzg2MmI0YmMtYzMxNi04NmU0LWIyM2QtMzZjOTk1NjNkMjQ4Il19LHsibmFtZSI6InJpZ2h0QXJtIiwib3JpZ2luIjpbLTUsMjIsMF0sInJvdGF0aW9uIjpbMCwwLC01XSwidXVpZCI6IjIzY2ZjZTk3LWY4ZmUtYTE0MC1mZThiLWU5NWFmMDU4NjZhOSIsImNoaWxkcmVuIjpbIjdlODZlY2Q1LWE2N2ItMDFmNy00ZTAzLTlmOTAzOGEwMDkxOCIsIjRhNmU5Yjg1LWQ2NjctZTBhOC1jMDQ3LWFmZmI3MWVjNDNiZiJdfSx7Im5hbWUiOiJsZWZ0TGVnIiwib3JpZ2luIjpbMS45LDEyLDBdLCJ1dWlkIjoiYjNkZjZlNjktZGUwMC03NGY3LTlhN2EtODVlN2Q2NWIxZGMzIiwiY2hpbGRyZW4iOlsiZThmNzRiMDgtNTEwYi0yMmYxLWNlYzEtZGM2ZmM3NjQxOTBmIiwiYTA1NWEyMjYtZTQ0Zi01MDRiLTg3MDktNTliYTkzZGViMzMxIl19LHsibmFtZSI6InJpZ2h0TGVnIiwib3JpZ2luIjpbLTEuOSwxMiwwXSwidXVpZCI6IjAwNDAwMjE0LWM0MjYtZWJkZi03OTRmLTg5N2FlMGIxOTkzZiIsImNoaWxkcmVuIjpbIjZiZTdhNTZhLTRmYjAtNjdjOC0xM2M1LTRkMmQ0ZmJlNTA3MCIsIjVlZTQ4NjQxLTY4OTAtODZhYi1lNDkxLTQ3YzkyMWYzMTdlYiJdfV0sInRleHR1cmVzIjpbeyJuYW1lIjoic3RldmUucG5nIiwiZm9sZGVyIjoiZW50aXR5IiwibmFtZXNwYWNlIjoibWluZWNyYWZ0IiwiaWQiOiIwIiwidXVpZCI6ImE4YjZiZmJiLTEzZjctNjdkMC02NzY5LWE4M2E4ZDczZTIxYyJ9XX0="
              
            
!
999px

Console