cssAudio - Activefile-genericCSS - ActiveGeneric - ActiveHTML - ActiveImage - ActiveJS - ActiveSVG - ActiveText - Activefile-genericVideo - ActiveLovehtmlicon-new-collectionicon-personicon-teamlog-outoctocatpop-outspinnerstartv

Pen Settings

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URL's added here will be added as <link>s in order, and before the CSS in the editor. If you link to another Pen, it will include the CSS from that Pen. If the preprocessor matches, it will attempt to combine them before processing.

Quick-add: + add another resource

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.

Quick-add: + add another resource

Code Indentation

     

Save Automatically?

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.

            
              @import "compass/css3";

@import "compass/reset";
@import "compass/css3";

body{
  overflow: hidden;
}

canvas{
  width: 100%;
  height: 100%;
}
            
          
!
            
              (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var positionLocation; 
// lookup uniforms
var resolutionLocation;
var colorLocation;
var points, targetPoints;
var PT_NUMBER = 80000;
var timeStr = ["0", "0", "0", "0", "0", "0"];


var test = require('canvas-testbed');

var Vector2 = require('vecmath').Vector2;

var toGlyphMatrix3 = require('fontpath-vecmath').toGlyphMatrix3;
var decompose = require('../index');

var TestFont = require('fontpath-test-fonts/lib/OpenBaskerville-0.0.75.ttf');

var tmpVec = new Vector2();

//var glyph = TestFont.glyphs["a"];

var vertexShaderScript = [
"attribute vec2 a_position;",
"uniform vec2 u_resolution;",
"void main() {",
"   vec2 zeroToOne = a_position / u_resolution;",
"   zeroToOne.y = 1.0 - zeroToOne.y ;",
"   vec2 zeroToTwo = zeroToOne * 2.0;",
"   vec2 clipSpace = zeroToTwo - 1.0;",
"   gl_Position = vec4(clipSpace, 0, 1);",
"   gl_PointSize =1.0;",
"}"
].join("\n");
var fragmentShaderScript = [
"precision mediump float;",
"uniform vec4 u_color;",
"void main() {",
"   gl_FragColor = u_color;",
"}"
].join("\n");


/*
var shapes = decompose(glyph, {
	steps: 20,
});

//We can optionally simplify the path like so.
//Remember, they are in font units (EM) so the simplify threshold
//has to be given accordingly
for (var i=0; i<shapes.length; i++) {
	shapes[i] = shapes[i].simplify( TestFont.size * 1 );
}

//Setup a simple glyph matrix to scale from EM to screen pixels...
//You can also just use fontpath-util directly, without using vecmath modules
var glyphMatrix = toGlyphMatrix3(TestFont, glyph, 200, 20, 200);
*/

function render(gl, width, height) {
 
  /*
  var randomPos = [];
  for(var ii = 0; ii < 100; ii++){
    randomPos.push({ x: Math.random() * window.innerWidth, y: Math.random() * window.innerHeight })
  }
  targetPts[targetPts.length] = randomPos ; */

	var pts;
	for(var jj = 0; jj < targetPoints.length; jj++){

		points[jj].x += (targetPoints[jj].x - points[jj].x) * .1;
		points[jj].y += (targetPoints[jj].y - points[jj].y) * .1;
	}



	gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
	
	var pts = []
	for(var ii = 0; ii < points.length; ii++){
		pts.push(points[ii].x, points[ii].y);
    }
//console.log(targetPoints.length);
//console.log(pts.length)

    //console.log(pts.length);

    pts = new Float32Array(pts);
    gl.bufferData( gl.ARRAY_BUFFER, pts, gl.DYNAMIC_DRAW );
    gl.uniform4f(colorLocation, 1.0, 1.0, 1.0, 1);
    gl.drawArrays(gl.POINTS, 0, pts.length/2); 
    gl.flush();
   

}

var targetPts;

var rad = 0;
function setTime(width, height){
	var date = new Date();
    var curHour = date.getHours();
    var curHourStr = curHour < 10 ? "0" + curHour : curHour;
    var curMin = date.getMinutes();
    var curMinStr = curMin <10 ? "0" + curMin : curMin;
    var curSec = date.getSeconds();
    var curSecStr = curSec < 10 ? "0" + curSec : curSec;

	var time = curHourStr.toString() + curMinStr + curSecStr;
	console.log(time)

	targetPts = [];
	var width = 40;


	for(var ii = 0; ii < time.length; ii++){
		targetPts[ii] = [];

		var glyph = TestFont.glyphs[time.charAt(ii)];
		var shapes = decompose(glyph, {
		    steps: 20
		});


		for (var i=0; i<shapes.length; i++) {
			shapes[i] = shapes[i].simplify( TestFont.size * 1 );
		}

		
		var glyphMatrix = toGlyphMatrix3(TestFont, glyph, 90, window.innerWidth/2 + -360 + 120*ii, window.innerHeight/2+80);
	
		for (var i=0; i<shapes.length; i++) {
			var s = shapes[i];
			for (var j=0; j<s.points.length; j++) {
				var p = s.points[j];

				tmpVec.copy(p);
				tmpVec.transformMat3(glyphMatrix);

				targetPts[ii].push({ x: tmpVec.x, y: tmpVec.y });
			}
		}

	}
  
   var randomPos = [];
  
  for(var ii = 0; ii < 100; ii++){
    randomPos.push({ x: Math.random() * window.innerWidth, y: Math.random() * window.innerHeight })
  }
//  targetPts.push(randomPos);
 
  targetPts[targetPts.length] = randomPos ;

	

	console.log(targetPts);

	rad = 300;
   bigChange++;
  
	setTimeout(setTime, 1000);
}

var count = 0;
var bigChange = 0;
function randomChangeTimer(){
	var number;
	var randomNumber;
	count++;

	//var rad = 50 * (Math.cos(new Date().getTime() / 120) + 1);
	rad *= .7;

	
  
	for(var jj = 0; jj < targetPoints.length; jj++){
		//console.log(targetPts)
		number = (jj+bigChange) % targetPts.length;


		randomNumber = (jj + count) % targetPts[number].length;

      if(number == targetPts.length - 1 ){
        targetPoints[jj].x = (Math.random())*window.innerWidth;
        targetPoints[jj].y = (.5*Math.random() + .25)*window.innerHeight;
      }else{
        targetPoints[jj].x = targetPts[number][randomNumber].x + rad * (Math.random() - .5);
        targetPoints[jj].y = targetPts[number][randomNumber].y + rad * (Math.random() - .5);
      }
		
	}
  
  
  

	setTimeout(randomChangeTimer, 100);

};


	


function start(gl, width, height){
console.log("start");	
console.log(gl);
console.log("width: ", width + ", height: ", height);

gl.viewport(0, 0, width, height);


var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderScript);
gl.compileShader(vertexShader);
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
    alert("Couldn't compile the vertex shader");
    gl.deleteShader(vertexShader);
    return;
}

var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderScript);
gl.compileShader(fragmentShader);
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
    alert("Couldn't compile the fragment shader");
    gl.deleteShader(fragmentShader);
    return;
  }

    //    Create a shader program.
  gl.program = gl.createProgram();
  gl.attachShader(gl.program, vertexShader);
  gl.attachShader(gl.program, fragmentShader);
  gl.linkProgram(gl.program);
  if (!gl.getProgramParameter(gl.program, gl.LINK_STATUS)) {
    alert("Unable to initialise shaders");
    gl.deleteProgram(gl.program);
    gl.deleteProgram(vertexShader);
    gl.deleteProgram(fragmentShader);
    return;
  }
  //    Install the program as part of the current rendering state
  gl.useProgram(gl.program);


  // look up where the vertex data needs to go.
  positionLocation = gl.getAttribLocation(gl.program, "a_position");
  colorLocation = gl.getAttribLocation(gl.program, "a_position");

  // lookup uniforms
  resolutionLocation = gl.getUniformLocation(gl.program, "u_resolution");
  colorLocation = gl.getUniformLocation(gl.program, "u_color");

  gl.uniform2f(resolutionLocation, width, height);

  var buffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
  gl.enableVertexAttribArray(positionLocation);
  gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);

  // =======================
  points = [];
  targetPoints = [];


  	for(var j = 0; j < PT_NUMBER; j++){
  		points[j] = {x: width/2, y: height/2};
  		targetPoints[j] = {x: width/2, y: height/2};
  	}

  	gl.clearColor(0.0, 0.0, 0.0, 1.0);
  //}

  setTime(width, height);
  randomChangeTimer();


  
}



//render a single frame to the canvas testbed
test(render, start, { once: false, context : "webgl" });

},{"../index":2,"canvas-testbed":3,"fontpath-test-fonts/lib/OpenBaskerville-0.0.75.ttf":6,"fontpath-vecmath":7,"vecmath":19}],2:[function(require,module,exports){
var Shape = require('shape2d');

var funcs = {
    'm': 'moveTo',
    'l': 'lineTo',
    'q': 'quadraticCurveTo',
    'c': 'bezierCurveTo'
};

/**
 * Decomposes a glyph and its outline from fontpath into a list of Shapes from shape2d.
 * This is a discrete set of points that can then be used for triangulation
 * or further effects.
 */
module.exports = function(glyph, options) {
    options = options||{};

    var curves = Boolean(options.approximateCurves);
    var steps = options.steps||10;
    var factor = options.approximationFactor;
    factor = (typeof factor==="number") ? factor : 0.5;

    var shapes = [];
    var shape = new Shape();
    shape.approximateCurves = curves;
    shape.approximationFactor = factor;
    shape.steps = steps;

    if (!glyph.path || glyph.path.length===0)
        return shapes;

    var path = glyph.path;
    for (var i=0; i<path.length; i++) {
        var p = path[i];
        var args = p.slice(1);
        var fkey = funcs[ p[0] ];

        //assume we are on a new shape when we reach a moveto
        //will have to revisit this with a better solution 
        //maybe even-odd rule
        if (i!==0 && fkey==='moveTo') {
            //push the current shape ahead..
            shapes.push(shape);

            shape = new Shape();
            shape.approximateCurves = curves;
            shape.approximationFactor = factor;
            shape.steps = steps;
        }

        shape[fkey].apply(shape, args);
    }

    shapes.push(shape);
    return shapes;
}
},{"shape2d":9}],3:[function(require,module,exports){
var domready = require('domready');
require('raf.js');

module.exports = function( render, start, options ) {
	domready(function() {
		options = options||{};

		document.body.style.margin = "0";
		document.body.style.overflow = "hidden";

		var canvas = document.createElement("canvas");
		canvas.width = window.innerWidth;
		canvas.height = window.innerHeight;
		canvas.setAttribute("id", "canvas");

		document.body.appendChild(canvas);

		var context,
			attribs = options.contextAttributes||{};
		if (options.context === "webgl" || options.context === "experimental-webgl") {
			try {
				context = (canvas.getContext('webgl', attribs) 
							|| canvas.getContext('experimental-webgl', attribs));
			} catch (e) {
				context = null;
			}
			if (!context) {
				throw "WebGL Context Not Supported -- try enabling it or using a different browser";
			}	
		} else {
			context = canvas.getContext(options.context||"2d", attribs);
		}

		var width = canvas.width,
			height = canvas.height;

		window.addEventListener("resize", function() {
			width = window.innerWidth;
			height = window.innerHeight;
			canvas.width = width;
			canvas.height = height;
		});

		
		var then = Date.now();

		if (typeof start === "function") {
			start(context, width, height);
		}

		if (typeof render === "function") {
			function renderHandler() {
				var now = Date.now();
				var dt = (now-then);

				if (!options.once)
					requestAnimationFrame(renderHandler);
				
				render(context, width, height, dt);
				then = now;
			}
			requestAnimationFrame(renderHandler);
		}			
	});
}
},{"domready":4,"raf.js":5}],4:[function(require,module,exports){
/*!
  * domready (c) Dustin Diaz 2014 - License MIT
  */
!function (name, definition) {

  if (typeof module != 'undefined') module.exports = definition()
  else if (typeof define == 'function' && typeof define.amd == 'object') define(definition)
  else this[name] = definition()

}('domready', function () {

  var fns = [], listener
    , doc = document
    , hack = doc.documentElement.doScroll
    , domContentLoaded = 'DOMContentLoaded'
    , loaded = (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState)


  if (!loaded)
  doc.addEventListener(domContentLoaded, listener = function () {
    doc.removeEventListener(domContentLoaded, listener)
    loaded = 1
    while (listener = fns.shift()) listener()
  })

  return function (fn) {
    loaded ? fn() : fns.push(fn)
  }

});

},{}],5:[function(require,module,exports){
/*
 * raf.js
 * https://github.com/ngryman/raf.js
 *
 * original requestAnimationFrame polyfill by Erik Möller
 * inspired from paul_irish gist and post
 *
 * Copyright (c) 2013 ngryman
 * Licensed under the MIT license.
 */

(function(window) {
	var lastTime = 0,
		vendors = ['webkit', 'moz'],
		requestAnimationFrame = window.requestAnimationFrame,
		cancelAnimationFrame = window.cancelAnimationFrame,
		i = vendors.length;

	// try to un-prefix existing raf
	while (--i >= 0 && !requestAnimationFrame) {
		requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];
		cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'];
	}

	// polyfill with setTimeout fallback
	// heavily inspired from @darius gist mod: https://gist.github.com/paulirish/1579671#comment-837945
	if (!requestAnimationFrame || !cancelAnimationFrame) {
		requestAnimationFrame = function(callback) {
			var now = +new Date(), nextTime = Math.max(lastTime + 16, now);
			return setTimeout(function() {
				callback(lastTime = nextTime);
			}, nextTime - now);
		};

		cancelAnimationFrame = clearTimeout;
	}

	// export to window
	window.requestAnimationFrame = requestAnimationFrame;
	window.cancelAnimationFrame = cancelAnimationFrame;
}(window));

},{}],6:[function(require,module,exports){
module.exports = {"size":64,"resolution":72,"underline_thickness":0,"underline_position":0,"max_advance_width":1096,"height":1134,"descender":-218,"ascender":916,"units_per_EM":1000,"style_name":"Normal","family_name":"Open Baskerville 0.0.75","kerning":[["@","T",-128],["@","V",-192],["@","W",-192],["F","@",-192],["T","@",-192],["V","A",-704],["V","e",-448],["W","@",-128],["a","s",64],["b",".",-64],["d","w",-64],["e",".",-64],["f","s",64],["g","b",64],["g","g",64],["g","p",64],["h","y",-128],["i","j",-128],["j","j",128],["j","s",64],["k","z",128],["n","y",-128],["o",".",-64],["p","t",-64],["s","t",-64],["s","w",-64],["t","o",-64],["t","z",64],["y","b",-192],["y","h",-64],["y","l",-64]],"glyphs":{"0":{"xoff":2048,"width":1856,"height":2944,"hbx":128,"hby":2880,"path":[["m",1482,2636],["q",1270,2880,1028,2880],["q",787,2880,574,2636],["q",362,2392,245,2053],["q",128,1714,128,1402],["q",128,757,412,375],["q",696,-7,1028,-7],["q",1360,-7,1644,375],["q",1928,757,1928,1402],["q",1928,1714,1811,2053],["q",1695,2392,1482,2636],["m",1441,441],["q",1282,59,1028,59],["q",774,59,615,441],["q",456,824,456,1404],["q",456,1993,615,2403],["q",774,2814,1028,2814],["q",1282,2814,1441,2403],["q",1600,1993,1600,1404],["q",1600,824,1441,441]]},"1":{"xoff":1344,"width":1344,"height":2816,"hbx":0,"hby":2816,"path":[["m",840,2789],["l",776,2789],["q",721,2728,648,2686],["q",576,2645,484,2624],["q",393,2603,335,2592],["q",277,2581,185,2573],["q",94,2565,90,2565],["l",90,2518],["q",180,2501,299,2501],["l",512,2524],["l",512,564],["q",512,293,409,182],["q",307,71,61,71],["l",61,5],["l",1315,5],["l",1315,71],["q",1073,71,956,179],["q",840,287,840,563],["l",840,2789]]},"2":{"xoff":2112,"width":1856,"height":2816,"hbx":128,"hby":2880,"path":[["m",128,64],["l",1758,64],["l",1924,754],["l",1896,754],["q",1891,738,1881,707],["q",1871,677,1833,603],["q",1795,529,1745,471],["q",1696,414,1606,367],["q",1517,320,1413,320],["l",473,320],["l",606,419],["q",735,522,860,621],["q",985,720,1155,866],["q",1325,1012,1438,1124],["q",1666,1351,1793,1629],["q",1920,1907,1920,2101],["q",1920,2204,1885,2322],["q",1850,2440,1767,2573],["q",1684,2707,1502,2793],["q",1320,2880,1067,2880],["q",847,2880,682,2811],["q",517,2743,430,2629],["q",343,2515,299,2397],["q",256,2279,256,2154],["q",256,1913,404,1761],["q",553,1610,729,1610],["q",952,1610,1026,1728],["q",888,1728,769,1767],["q",650,1806,549,1933],["q",448,2061,448,2263],["q",448,2415,509,2530],["q",570,2645,662,2703],["q",754,2761,842,2787],["q",930,2814,1006,2814],["q",1090,2814,1175,2791],["q",1261,2769,1364,2710],["q",1467,2651,1529,2520],["q",1592,2390,1592,2202],["q",1592,1666,871,829],["q",753,695,568,513],["q",384,331,254,217],["l",128,102],["l",128,64]]},"3":{"xoff":2048,"width":1792,"height":2944,"hbx":128,"hby":2880,"path":[["m",576,2460],["q",576,2583,671,2698],["q",766,2814,991,2814],["q",1528,2814,1528,2175],["q",1528,2009,1483,1882],["q",1439,1755,1382,1691],["q",1325,1627,1253,1587],["q",1181,1547,1136,1539],["q",1092,1531,1067,1531],["q",1004,1531,938,1565],["q",872,1600,814,1600],["q",635,1600,635,1470],["q",635,1407,683,1375],["q",732,1344,787,1344],["q",848,1344,940,1404],["q",1032,1465,1112,1465],["q",1268,1465,1402,1276],["q",1536,1088,1536,797],["q",1536,477,1366,268],["q",1196,59,904,59],["q",645,59,514,201],["q",384,343,384,576],["q",384,835,584,981],["q",528,989,504,989],["q",340,989,234,870],["q",128,752,128,576],["q",128,389,223,262],["q",319,135,465,82],["q",611,30,716,11],["q",822,-7,911,-7],["q",1370,-7,1617,227],["q",1864,461,1864,818],["q",1864,1322,1274,1521],["q",1546,1583,1701,1756],["q",1856,1929,1856,2178],["q",1856,2274,1813,2386],["q",1770,2498,1682,2614],["q",1594,2731,1422,2805],["q",1251,2880,1024,2880],["q",701,2880,510,2727],["q",320,2574,320,2388],["q",320,2267,412,2166],["q",505,2065,667,2065],["q",803,2065,847,2110],["q",576,2184,576,2460]]},"4":{"xoff":1984,"width":1856,"height":2880,"hbx":0,"hby":2880,"path":[["m",762,59],["l",762,5],["l",1788,5],["l",1788,59],["q",1535,59,1471,157],["q",1408,256,1408,573],["l",1408,697],["l",1478,697],["q",1661,697,1726,632],["q",1792,568,1792,373],["l",1792,320],["l",1856,320],["l",1856,1152],["l",1792,1152],["l",1792,1102],["q",1792,916,1709,839],["q",1626,763,1443,763],["l",1408,763],["l",1408,2880],["l",1342,2880],["l",32,733],["l",32,697],["l",1152,697],["l",1152,573],["q",1152,277,1077,168],["q",1002,59,762,59],["m",127,763],["l",1152,2437],["l",1152,763],["l",127,763]]},"5":{"xoff":1792,"width":1728,"height":3008,"hbx":-128,"hby":2880,"path":[["m",391,1257],["q",524,1657,827,1657],["q",990,1657,1095,1537],["q",1201,1418,1236,1271],["q",1272,1125,1272,960],["q",1272,613,1083,304],["q",894,-5,590,-5],["q",400,-5,300,84],["q",200,173,200,301],["q",200,523,174,591],["q",148,659,36,659],["q",-48,659,-88,591],["q",-128,523,-128,440],["q",-128,292,-42,183],["q",43,74,173,24],["q",304,-25,411,-48],["q",519,-71,604,-71],["q",970,-71,1285,228],["q",1600,527,1600,969],["q",1600,1302,1377,1512],["q",1154,1723,861,1723],["q",592,1723,462,1566],["l",682,2545],["q",836,2496,1128,2496],["q",1335,2496,1444,2578],["q",1554,2661,1554,2797],["q",1554,2832,1550,2839],["q",1497,2752,1233,2752],["q",803,2752,690,2814],["l",320,1286],["l",391,1257]]},"6":{"xoff":1984,"width":1792,"height":2944,"hbx":128,"hby":2880,"path":[["m",128,1226],["q",128,653,357,323],["q",587,-7,988,-7],["q",1339,-7,1601,285],["q",1864,578,1864,963],["q",1864,1341,1603,1596],["q",1343,1851,981,1851],["q",661,1851,476,1598],["q",476,1732,523,1928],["q",571,2124,653,2326],["q",735,2528,875,2671],["q",1015,2814,1175,2814],["q",1315,2814,1384,2759],["q",1454,2705,1466,2637],["q",1479,2570,1518,2515],["q",1557,2461,1639,2461],["q",1791,2461,1791,2598],["q",1791,2727,1660,2803],["q",1529,2880,1308,2880],["q",837,2880,482,2401],["q",128,1922,128,1226],["m",456,963],["q",456,1785,1001,1785],["q",1264,1785,1400,1557],["q",1536,1329,1536,963],["q",1536,548,1400,303],["q",1264,59,983,59],["q",736,59,596,318],["q",456,577,456,963]]},"7":{"xoff":1792,"width":1664,"height":2944,"hbx":64,"hby":2880,"path":[["m",503,2752],["q",422,2752,373,2783],["q",324,2814,316,2847],["l",312,2880],["l",283,2880],["l",111,2035],["l",140,2035],["q",148,2150,282,2291],["q",417,2432,625,2432],["l",1548,2432],["l",443,397],["q",430,373,401,324],["q",373,275,358,248],["q",344,221,332,178],["q",320,135,320,95],["q",320,37,365,2],["q",410,-32,474,-32],["q",589,-32,642,26],["q",696,84,760,253],["l",1728,2706],["l",1728,2752],["l",503,2752]]},"8":{"xoff":2112,"width":1728,"height":2944,"hbx":192,"hby":2880,"path":[["m",1247,1588],["q",1792,1827,1792,2271],["q",1792,2580,1570,2730],["q",1348,2880,1034,2880],["q",951,2880,864,2868],["q",777,2856,663,2810],["q",550,2765,463,2693],["q",376,2621,316,2483],["q",256,2346,256,2168],["q",256,1905,399,1749],["q",543,1593,810,1453],["q",192,1235,192,694],["q",192,513,285,370],["q",378,227,518,149],["q",659,71,797,32],["q",936,-7,1048,-7],["q",1192,-7,1333,32],["q",1474,71,1612,153],["q",1750,235,1835,393],["q",1920,551,1920,764],["q",1920,1083,1744,1261],["q",1569,1440,1247,1588],["m",867,1424],["q",1033,1351,1140,1289],["q",1248,1227,1363,1135],["q",1478,1043,1535,922],["q",1592,801,1592,650],["q",1592,473,1535,348],["q",1478,223,1389,166],["q",1300,109,1222,84],["q",1145,59,1073,59],["q",996,59,916,80],["q",837,101,737,160],["q",638,219,575,358],["q",512,498,512,702],["q",512,952,626,1143],["q",741,1334,867,1424],["m",1178,1621],["q",840,1756,676,1901],["q",512,2047,512,2339],["q",512,2814,959,2814],["q",1172,2814,1318,2683],["q",1464,2552,1464,2245],["q",1464,2047,1412,1912],["q",1361,1777,1312,1726],["q",1264,1675,1178,1621]]},"9":{"xoff":2048,"width":1792,"height":2944,"hbx":128,"hby":2880,"path":[["m",1864,1639],["q",1864,2213,1635,2546],["q",1406,2880,1004,2880],["q",652,2880,390,2583],["q",128,2287,128,1902],["q",128,1526,389,1271],["q",650,1017,1011,1017],["q",1331,1017,1516,1269],["q",1516,1133,1469,937],["q",1422,741,1339,541],["q",1257,341,1117,200],["q",977,59,817,59],["q",677,59,607,114],["q",537,169,525,232],["q",513,295,474,350],["q",435,406,353,406],["q",200,406,200,268],["q",200,139,331,66],["q",462,-7,684,-7],["q",1156,-7,1510,468],["q",1864,943,1864,1639],["m",1536,1902],["q",1536,1083,992,1083],["q",729,1083,592,1310],["q",456,1538,456,1902],["q",456,2317,592,2565],["q",729,2814,1009,2814],["q",1256,2814,1396,2550],["q",1536,2287,1536,1902]]}," ":{"xoff":1152,"width":0,"height":0,"hbx":0,"hby":0,"path":[]},"!":{"xoff":960,"width":512,"height":2880,"hbx":256,"hby":2816,"path":[["m",458,480],["l",502,480],["l",690,2513],["q",715,2784,479,2784],["q",355,2784,306,2705],["q",257,2626,269,2513],["l",458,480],["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",575,-64,639,0],["q",704,64,704,158],["q",704,252,639,318],["q",575,384,480,384],["q",385,384,320,318]]},"\"":{"xoff":1216,"width":896,"height":832,"hbx":128,"hby":2560,"path":[["m",858,2560],["q",807,2560,751,2515],["q",696,2471,696,2429],["q",696,2319,744,2105],["q",793,1892,793,1787],["q",802,1728,849,1728],["q",897,1728,902,1787],["q",911,1889,967,2102],["q",1024,2315,1024,2429],["q",1024,2471,973,2515],["q",922,2560,858,2560],["m",291,2560],["q",241,2560,184,2515],["q",128,2471,128,2429],["q",128,2319,178,2105],["q",228,1892,228,1787],["q",237,1728,283,1728],["q",330,1728,335,1787],["q",344,1889,400,2102],["q",456,2315,456,2429],["q",456,2471,406,2515],["q",356,2560,291,2560]]},"#":{"xoff":2304,"width":2176,"height":2496,"hbx":64,"hby":2496,"path":[["m",1688,2464],["l",1307,32],["l",1503,32],["l",1896,2464],["l",1688,2464],["m",856,2496],["l",471,32],["l",664,32],["l",1053,2496],["l",856,2496],["m",164,950],["l",127,768],["l",2097,768],["l",2150,950],["l",164,950],["m",291,1792],["l",242,1623],["l",2159,1623],["l",2216,1792],["l",291,1792]]},"$":{"xoff":2112,"width":1792,"height":3648,"hbx":192,"hby":3136,"path":[["m",1024,1576],["l",1142,1576],["l",1142,3134],["l",1024,3134],["l",1024,1576],["m",1024,-450],["l",1142,-450],["l",1142,1441],["l",1024,1441],["l",1024,-450],["m",1094,-7],["q",1533,-7,1758,195],["q",1984,398,1984,746],["q",1984,982,1833,1166],["q",1683,1351,1465,1467],["q",1247,1583,1032,1691],["q",817,1800,664,1955],["q",512,2111,512,2307],["q",512,2454,566,2560],["q",621,2666,704,2717],["q",787,2768,860,2791],["q",934,2814,998,2814],["q",1233,2814,1348,2732],["q",1464,2651,1464,2528],["q",1464,2238,1639,2238],["q",1717,2238,1754,2277],["q",1792,2316,1792,2414],["q",1792,2608,1563,2744],["q",1334,2880,1010,2880],["q",702,2880,479,2689],["q",256,2499,256,2180],["q",256,1999,331,1858],["q",407,1717,523,1624],["q",640,1532,784,1452],["q",929,1373,1072,1295],["q",1216,1218,1333,1134],["q",1450,1050,1525,923],["q",1600,796,1600,636],["q",1600,366,1454,212],["q",1309,59,1092,59],["q",851,59,685,183],["q",520,308,520,431],["q",520,562,489,631],["q",458,700,366,700],["q",292,700,242,655],["q",192,611,192,525],["q",192,308,471,150],["q",750,-7,1094,-7]]},"%":{"xoff":2432,"width":2176,"height":2816,"hbx":128,"hby":2752,"path":[["m",1216,603],["q",1216,323,1375,158],["q",1534,-7,1760,-7],["q",1982,-7,2143,160],["q",2304,327,2304,602],["q",2304,877,2141,1044],["q",1978,1211,1760,1211],["q",1538,1211,1377,1044],["q",1216,877,1216,603],["m",1759,59],["q",1472,59,1472,602],["q",1472,1145,1759,1145],["q",1915,1145,1981,1015],["q",2048,886,2048,603],["q",2048,322,1981,190],["q",1915,59,1759,59],["m",266,-21],["l",311,-50],["l",2167,2687],["l",2118,2712],["l",266,-21],["m",128,2106],["q",128,1842,287,1685],["q",446,1529,672,1529],["q",894,1529,1055,1687],["q",1216,1846,1216,2106],["q",1216,2367,1053,2525],["q",890,2683,672,2683],["q",450,2683,289,2525],["q",128,2367,128,2106],["m",673,1595],["q",384,1595,384,2106],["q",384,2617,673,2617],["q",827,2617,893,2495],["q",960,2373,960,2106],["q",960,1843,893,1719],["q",827,1595,673,1595]]},"&":{"xoff":2560,"width":2752,"height":2944,"hbx":128,"hby":2880,"path":[["m",456,854],["q",456,1073,561,1266],["q",667,1459,838,1565],["l",1638,434],["q",1515,258,1358,161],["q",1201,64,1058,64],["q",791,64,623,295],["q",456,526,456,854],["m",704,2483],["q",704,2640,805,2727],["q",906,2814,1036,2814],["q",1210,2814,1309,2701],["q",1408,2589,1408,2432],["q",1408,2226,1293,2026],["q",1178,1827,1080,1775],["q",1068,1795,1001,1879],["q",935,1964,911,1998],["q",887,2033,836,2109],["q",785,2186,764,2236],["q",744,2286,724,2354],["q",704,2423,704,2483],["m",2138,1342],["q",2210,1498,2299,1577],["q",2388,1657,2538,1657],["l",2570,1657],["l",2570,1723],["l",1775,1723],["l",1775,1657],["l",1807,1657],["q",2055,1657,2055,1426],["q",2055,1301,1976,1123],["l",1806,766],["l",1123,1711],["q",1127,1716,1235,1777],["q",1344,1839,1389,1876],["q",1434,1914,1514,1990],["q",1594,2067,1629,2162],["q",1664,2258,1664,2374],["q",1664,2639,1478,2759],["q",1292,2880,1056,2880],["q",856,2880,684,2734],["q",512,2589,512,2313],["q",512,2034,809,1607],["q",547,1498,337,1258],["q",128,1018,128,707],["q",128,341,331,143],["q",534,-54,884,-54],["q",1151,-54,1321,49],["q",1492,152,1672,392],["q",2048,-54,2451,-54],["q",2685,-54,2782,44],["q",2880,143,2880,291],["l",2816,291],["q",2816,216,2735,140],["q",2654,64,2567,64],["q",2384,64,2152,304],["q",1921,544,1846,716],["l",2138,1342]]},"'":{"xoff":640,"width":384,"height":896,"hbx":128,"hby":2880,"path":[["m",289,2880],["q",240,2880,184,2832],["q",128,2785,128,2745],["q",128,2625,162,2392],["q",196,2160,202,2046],["q",202,1984,266,1984],["q",320,1984,320,2046],["q",329,2160,392,2392],["q",456,2625,456,2745],["q",456,2789,404,2834],["q",352,2880,289,2880]]},"(":{"xoff":1344,"width":1152,"height":3520,"hbx":0,"hby":2880,"path":[["m",0,1012],["q",0,702,146,382],["q",293,63,486,-152],["q",680,-368,859,-504],["q",1038,-640,1120,-640],["l",1120,-508],["q",1022,-442,899,-312],["q",777,-182,642,12],["q",508,207,418,473],["q",328,740,328,1012],["q",328,1393,410,1711],["q",492,2029,608,2211],["q",724,2393,840,2521],["q",957,2649,1038,2698],["l",1120,2744],["l",1120,2880],["q",1092,2880,975,2801],["q",859,2723,692,2560],["q",525,2397,370,2184],["q",216,1971,108,1657],["q",0,1343,0,1012]]},")":{"xoff":1344,"width":1216,"height":3520,"hbx":0,"hby":2880,"path":[["m",1160,1012],["q",1160,702,1012,382],["q",864,63,669,-152],["q",475,-368,294,-504],["q",114,-640,32,-640],["l",32,-508],["q",131,-442,254,-312],["q",378,-182,514,12],["q",650,207,741,473],["q",832,740,832,1012],["q",832,1393,749,1711],["q",667,2029,549,2211],["q",431,2393,314,2521],["q",197,2649,115,2698],["l",32,2744],["l",32,2880],["q",61,2880,177,2801],["q",294,2723,462,2560],["q",631,2397,787,2184],["q",943,1971,1051,1657],["q",1160,1343,1160,1012]]},"*":{"xoff":1088,"width":1152,"height":1088,"hbx":64,"hby":3136,"path":[["m",629,2503],["q",584,2464,466,2406],["q",348,2348,270,2293],["q",192,2238,192,2179],["q",192,2123,234,2085],["q",276,2048,320,2048],["q",425,2048,479,2127],["q",534,2206,575,2315],["q",617,2424,670,2463],["q",706,2424,737,2315],["q",768,2206,809,2127],["q",851,2048,933,2048],["q",1024,2048,1024,2170],["q",1024,2253,975,2305],["q",926,2357,834,2410],["q",743,2464,703,2503],["q",797,2523,903,2509],["q",1010,2495,1097,2521],["q",1184,2547,1184,2633],["q",1184,2752,1079,2752],["q",999,2752,891,2667],["q",783,2582,703,2566],["q",703,2637,735,2773],["q",768,2910,768,3016],["q",768,3070,734,3103],["q",700,3136,638,3136],["q",512,3136,512,3016],["q",512,2915,570,2776],["q",629,2637,629,2566],["q",551,2583,424,2667],["q",297,2752,198,2752],["q",64,2752,64,2637],["q",64,2552,165,2523],["q",266,2495,393,2509],["q",521,2524,629,2503]]},"+":{"xoff":2048,"width":1536,"height":1600,"hbx":256,"hby":1728,"path":[["m",950,1728],["l",950,968],["l",256,968],["l",256,832],["l",950,832],["l",950,128],["l",1088,128],["l",1088,832],["l",1792,832],["l",1792,968],["l",1088,968],["l",1088,1728],["l",950,1728]]},",":{"xoff":960,"width":576,"height":1088,"hbx":192,"hby":384,"path":[["m",438,-64],["q",541,-64,576,-4],["q",576,-195,461,-352],["q",346,-510,203,-592],["l",228,-646],["q",421,-575,567,-369],["q",714,-164,714,44],["q",714,208,636,296],["q",559,384,444,384],["q",347,384,285,313],["q",224,243,224,145],["q",224,52,285,-6],["q",347,-64,438,-64]]},"-":{"xoff":1408,"width":960,"height":192,"hbx":192,"hby":960,"path":[["m",192,958],["l",192,768],["l",1085,768],["l",1109,958],["l",192,958]]},".":{"xoff":960,"width":448,"height":448,"hbx":256,"hby":384,"path":[["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",575,-64,639,0],["q",704,64,704,158],["q",704,252,639,318],["q",575,384,480,384],["q",385,384,320,318]]},"/":{"xoff":1216,"width":1152,"height":3136,"hbx":64,"hby":2880,"path":[["m",66,-165],["l",266,-219],["l",1163,2766],["l",963,2824],["l",66,-165]]},":":{"xoff":960,"width":448,"height":1856,"hbx":256,"hby":1792,"path":[["m",320,1726],["q",256,1660,256,1566],["q",256,1472,320,1408],["q",385,1344,480,1344],["q",575,1344,639,1408],["q",704,1472,704,1566],["q",704,1660,639,1726],["q",575,1792,480,1792],["q",385,1792,320,1726],["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",575,-64,639,0],["q",704,64,704,158],["q",704,252,639,318],["q",575,384,480,384],["q",385,384,320,318]]},";":{"xoff":960,"width":576,"height":2432,"hbx":192,"hby":1792,"path":[["m",320,1727],["q",256,1663,256,1568],["q",256,1473,320,1408],["q",384,1344,479,1344],["q",575,1344,639,1408],["q",704,1473,704,1568],["q",704,1663,639,1727],["q",575,1792,479,1792],["q",384,1792,320,1727],["m",470,-64],["q",589,-64,630,-4],["q",630,-356,216,-551],["l",250,-605],["q",461,-534,614,-345],["q",768,-157,768,44],["q",768,208,682,296],["q",596,384,469,384],["q",361,384,292,313],["q",224,243,224,145],["q",224,52,294,-6],["q",365,-64,470,-64]]},"<":{"xoff":2176,"width":1920,"height":2368,"hbx":128,"hby":2368,"path":[["m",2016,2085],["l",2016,2312],["l",128,1317],["l",128,1106],["l",2048,0],["l",2048,244],["l",368,1205],["l",2016,2085]]},"=":{"xoff":2048,"width":1408,"height":576,"hbx":320,"hby":1152,"path":[["m",320,576],["l",1728,576],["l",1728,708],["l",320,708],["l",320,576],["m",320,960],["l",1728,960],["l",1728,1092],["l",320,1092],["l",320,960]]},">":{"xoff":2176,"width":1728,"height":2112,"hbx":320,"hby":2112,"path":[["m",352,1874],["l",352,2081],["l",2048,1185],["l",2048,995],["l",320,0],["l",320,219],["l",1833,1086],["l",352,1874]]},"?":{"xoff":1920,"width":1472,"height":2944,"hbx":256,"hby":2880,"path":[["m",552,1259],["q",630,1191,708,1168],["q",787,1145,935,1145],["q",1236,1145,1454,1355],["q",1672,1566,1672,1933],["q",1672,2153,1587,2339],["q",1503,2525,1373,2639],["q",1243,2753,1094,2816],["q",945,2880,809,2880],["q",624,2880,440,2764],["q",256,2649,256,2531],["q",256,2491,276,2464],["q",296,2438,329,2438],["q",453,2438,497,2607],["q",553,2814,766,2814],["q",991,2814,1167,2568],["q",1344,2323,1344,1927],["q",1344,1620,1241,1415],["q",1138,1211,916,1211],["q",511,1211,511,1728],["l",437,1728],["l",437,576],["l",552,576],["l",552,1259],["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",576,-64,640,0],["q",704,64,704,158],["q",704,252,640,318],["q",576,384,480,384],["q",385,384,320,318]]},"@":{"xoff":3200,"width":2816,"height":2880,"hbx":192,"hby":2304,"path":[["m",2354,-5],["q",2238,-5,2211,81],["q",2184,167,2184,369],["l",2184,1284],["q",2184,1787,1544,1787],["q",1351,1787,1165,1700],["q",980,1613,980,1468],["q",980,1395,1021,1348],["q",1063,1302,1127,1302],["q",1257,1302,1282,1460],["q",1305,1614,1362,1667],["q",1420,1721,1527,1721],["q",1618,1721,1683,1691],["q",1749,1662,1782,1622],["q",1816,1582,1831,1506],["q",1847,1430,1851,1373],["q",1856,1316,1856,1219],["q",1856,1093,1760,998],["q",1665,903,1529,882],["q",1182,835,1035,728],["q",888,621,888,371],["q",888,304,908,238],["q",928,173,978,97],["q",1028,22,1133,-24],["q",1239,-71,1390,-71],["q",1605,-71,1683,-34],["q",1761,3,1837,115],["q",1991,-71,2230,-71],["q",2428,-71,2586,41],["q",2745,153,2832,331],["q",2919,510,2963,701],["q",3008,892,3008,1074],["q",3008,1556,2622,1927],["q",2236,2299,1674,2299],["q",1016,2299,604,1890],["q",192,1482,192,970],["q",192,622,314,336],["q",436,50,639,-134],["q",843,-319,1103,-419],["q",1364,-519,1649,-519],["q",1922,-519,2137,-468],["q",2353,-417,2440,-365],["q",2528,-313,2528,-282],["q",2528,-259,2503,-259],["q",2495,-259,2467,-279],["q",2439,-300,2382,-328],["q",2325,-356,2240,-384],["q",2155,-412,2001,-432],["q",1848,-453,1653,-453],["q",1358,-453,1133,-337],["q",909,-222,779,-18],["q",649,185,584,435],["q",520,685,520,978],["q",520,1538,861,1885],["q",1203,2233,1701,2233],["q",2115,2233,2433,1906],["q",2752,1580,2752,1044],["q",2752,565,2642,280],["q",2532,-5,2354,-5],["m",1492,-5],["q",1371,-5,1307,53],["q",1243,111,1229,178],["q",1216,245,1216,350],["q",1216,437,1256,514],["q",1297,592,1375,654],["q",1453,717,1526,761],["q",1599,805,1702,863],["q",1805,922,1856,955],["l",1856,576],["q",1856,291,1782,143],["q",1708,-5,1492,-5]]},"A":{"xoff":2944,"width":2944,"height":2880,"hbx":0,"hby":2816,"path":[["m",1558,935],["l",1558,935],["m",2914,-7],["l",2914,59],["l",2864,59],["q",2566,59,2395,501],["l",1501,2777],["l",1489,2777],["l",519,619],["q",356,263,239,148],["q",144,59,51,59],["l",18,59],["l",18,-7],["l",921,-7],["l",921,59],["l",888,59],["q",722,59,649,158],["q",576,257,576,412],["q",576,553,640,707],["l",803,1073],["l",1749,1073],["l",1797,951],["q",1984,473,1984,306],["q",1984,59,1655,59],["l",1607,59],["l",1607,-7],["l",2914,-7],["m",1310,2205],["l",1716,1155],["l",840,1155],["l",1310,2205]]},"B":{"xoff":2752,"width":2560,"height":2816,"hbx":128,"hby":2816,"path":[["m",1352,1465],["q",1772,1465,1974,1329],["q",2176,1194,2176,794],["q",2176,441,1986,256],["q",1797,71,1474,71],["q",1243,71,1133,177],["q",1024,284,1024,564],["l",1024,1465],["l",1352,1465],["m",1024,2745],["l",1273,2745],["q",1984,2745,1984,2121],["q",1984,1814,1828,1672],["q",1673,1531,1314,1531],["l",1024,1531],["l",1024,2745],["m",185,2811],["l",185,2745],["l",234,2745],["q",640,2745,640,2276],["l",640,564],["q",640,321,517,196],["q",394,71,205,71],["l",160,71],["l",160,5],["l",1697,5],["q",1981,5,2098,28],["q",2215,51,2343,131],["q",2478,220,2583,408],["q",2688,597,2688,770],["q",2688,943,2614,1081],["q",2540,1219,2432,1301],["q",2325,1383,2194,1437],["q",2064,1492,1965,1511],["q",1866,1531,1796,1531],["q",2432,1682,2432,2181],["q",2432,2406,2298,2551],["q",2164,2696,1971,2753],["q",1779,2811,1539,2811],["l",185,2811]]},"C":{"xoff":2752,"width":2496,"height":2944,"hbx":192,"hby":2880,"path":[["m",2616,1920],["l",2616,2816],["l",2562,2816],["q",2554,2777,2523,2738],["q",2492,2700,2451,2700],["q",2439,2700,2155,2790],["q",1872,2880,1585,2880],["q",997,2880,594,2439],["q",192,1998,192,1412],["q",192,719,584,332],["q",976,-54,1641,-54],["q",1814,-54,1986,-6],["q",2159,41,2321,136],["q",2484,231,2586,404],["q",2688,578,2688,805],["l",2624,805],["q",2624,494,2369,279],["q",2114,64,1689,64],["q",1224,64,932,445],["q",640,827,640,1409],["q",640,1992,923,2403],["q",1207,2814,1622,2814],["q",1995,2814,2231,2616],["q",2468,2419,2591,1920],["l",2616,1920]]},"D":{"xoff":3264,"width":2944,"height":2816,"hbx":128,"hby":2752,"path":[["m",1440,59],["q",1328,59,1270,69],["q",1213,79,1146,123],["q",1080,168,1052,272],["q",1024,377,1024,547],["l",1024,2681],["l",1379,2681],["q",1640,2681,1858,2591],["q",2077,2502,2216,2363],["q",2355,2225,2449,2048],["q",2543,1871,2583,1704],["q",2624,1537,2624,1382],["q",2624,869,2294,464],["q",1965,59,1440,59],["m",1647,-7],["q",2044,-7,2333,111],["q",2622,229,2777,432],["q",2932,636,3002,868],["q",3072,1101,3072,1370],["q",3072,1561,3028,1742],["q",2985,1924,2875,2111],["q",2766,2299,2597,2435],["q",2428,2571,2151,2659],["q",1874,2747,1523,2747],["l",189,2747],["l",189,2706],["l",238,2706],["q",640,2706,640,2241],["l",640,547],["q",640,307,517,183],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1647,-7]]},"E":{"xoff":2688,"width":2496,"height":2816,"hbx":128,"hby":2816,"path":[["m",1552,983],["l",1552,983],["m",640,564],["q",640,321,518,196],["q",397,71,210,71],["l",165,71],["l",165,5],["l",2624,5],["l",2624,845],["l",2598,845],["q",2519,71,1695,71],["q",1347,71,1185,191],["q",1024,312,1024,567],["l",1024,1465],["l",1254,1465],["q",1472,1465,1600,1339],["q",1728,1214,1728,1003],["l",1728,960],["l",1792,960],["l",1792,2048],["l",1728,2048],["l",1728,2001],["q",1728,1531,1292,1531],["l",1024,1531],["l",1024,2745],["l",1527,2745],["q",2321,2745,2367,2167],["l",2400,2167],["l",2400,2811],["l",190,2811],["l",190,2745],["l",239,2745],["q",640,2745,640,2276],["l",640,564]]},"F":{"xoff":2496,"width":2304,"height":2880,"hbx":128,"hby":2816,"path":[["m",1088,1465],["l",1298,1465],["q",1496,1465,1612,1324],["q",1728,1183,1728,944],["l",1728,896],["l",1792,896],["l",1792,1984],["l",1728,1984],["l",1728,1943],["q",1728,1531,1332,1531],["l",1088,1531],["l",1088,2745],["l",1567,2745],["q",2323,2745,2367,2114],["l",2400,2114],["l",2400,2811],["l",198,2811],["l",198,2745],["l",246,2745],["q",640,2745,640,2273],["l",640,555],["q",640,310,517,184],["q",395,59,210,59],["l",165,59],["l",165,-7],["l",1530,-7],["l",1530,59],["l",1488,59],["q",1317,59,1202,187],["q",1088,316,1088,556],["l",1088,1465]]},"G":{"xoff":3264,"width":2944,"height":2944,"hbx":192,"hby":2880,"path":[["m",192,1436],["q",192,733,569,363],["q",946,-7,1642,-7],["q",2173,-7,2534,297],["l",2688,269],["l",2688,729],["q",2688,826,2723,888],["q",2759,951,2826,975],["q",2893,1000,2947,1008],["q",3001,1017,3080,1017],["l",3136,1017],["l",3136,1083],["l",1792,1083],["l",1792,1017],["l",1837,1017],["q",2240,1017,2240,657],["q",2240,604,2226,539],["q",2212,475,2172,386],["q",2132,298,2068,227],["q",2005,156,1894,107],["q",1784,59,1644,59],["q",1248,59,976,461],["q",704,863,704,1434],["q",704,2009,978,2411],["q",1253,2814,1653,2814],["q",1998,2814,2220,2613],["q",2443,2412,2559,1920],["l",2584,1920],["l",2584,2816],["l",2529,2816],["q",2520,2777,2490,2738],["q",2460,2700,2419,2700],["q",2383,2700,2275,2746],["q",2168,2792,1998,2836],["q",1828,2880,1641,2880],["q",1014,2880,603,2467],["q",192,2054,192,1436]]},"H":{"xoff":3584,"width":3328,"height":2880,"hbx":128,"hby":2816,"path":[["m",2560,1467],["l",1024,1467],["l",1024,2267],["q",1024,2745,1430,2745],["l",1480,2745],["l",1480,2811],["l",189,2811],["l",189,2745],["l",238,2745],["q",640,2745,640,2273],["l",640,555],["q",640,310,517,184],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1509,-7],["l",1509,59],["l",1463,59],["q",1271,59,1147,184],["q",1024,310,1024,554],["l",1024,1401],["l",2560,1401],["l",2560,554],["q",2560,310,2436,184],["q",2313,59,2121,59],["l",2075,59],["l",2075,-7],["l",3423,-7],["l",3423,59],["l",3378,59],["q",3190,59,3067,184],["q",2944,310,2944,555],["l",2944,2273],["q",2944,2745,3346,2745],["l",3395,2745],["l",3395,2811],["l",2104,2811],["l",2104,2745],["l",2154,2745],["q",2560,2745,2560,2267],["l",2560,1467]]},"I":{"xoff":1664,"width":1408,"height":2880,"hbx":128,"hby":2816,"path":[["m",830,952],["l",830,952],["m",189,2811],["l",189,2745],["l",238,2745],["q",640,2745,640,2273],["l",640,555],["q",640,310,517,184],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1504,-7],["l",1504,59],["l",1458,59],["q",1270,59,1147,184],["q",1024,310,1024,555],["l",1024,2273],["q",1024,2745,1426,2745],["l",1475,2745],["l",1475,2811],["l",189,2811]]},"J":{"xoff":1856,"width":1920,"height":3584,"hbx":-128,"hby":2816,"path":[["m",896,-74],["q",896,-645,542,-645],["q",494,-645,453,-628],["q",412,-612,390,-593],["q",368,-575,343,-531],["q",318,-488,312,-471],["q",306,-455,290,-396],["l",269,-339],["q",209,-157,83,-157],["q",13,-157,-41,-206],["q",-96,-256,-96,-363],["q",-96,-526,92,-618],["q",280,-711,488,-711],["q",876,-711,1078,-542],["q",1280,-374,1280,-91],["l",1280,2271],["q",1280,2745,1681,2745],["l",1730,2745],["l",1730,2811],["l",451,2811],["l",451,2745],["l",501,2745],["q",896,2745,896,2273],["l",896,-74]]},"K":{"xoff":3072,"width":3008,"height":2880,"hbx":128,"hby":2816,"path":[["m",189,2811],["l",189,2745],["l",238,2745],["q",640,2745,640,2273],["l",640,555],["q",640,310,517,184],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1513,-7],["l",1513,59],["l",1467,59],["q",1275,59,1149,184],["q",1024,310,1024,555],["l",1024,1266],["l",1254,1481],["l",2035,468],["q",2144,327,2144,244],["q",2144,158,2066,108],["q",1989,59,1872,59],["l",1826,59],["l",1826,-7],["l",3101,-7],["l",3101,59],["l",3055,59],["q",2964,59,2854,139],["q",2745,220,2670,319],["l",1559,1762],["l",1971,2145],["q",2594,2745,2765,2745],["l",2794,2745],["l",2794,2811],["l",1943,2811],["l",1943,2745],["l",1977,2745],["q",2071,2745,2139,2703],["q",2208,2662,2208,2580],["q",2208,2551,2193,2514],["q",2179,2477,2149,2437],["q",2120,2398,2090,2361],["q",2061,2324,2009,2274],["q",1957,2225,1921,2192],["q",1885,2159,1822,2100],["q",1759,2042,1725,2013],["l",1024,1365],["l",1024,2274],["q",1024,2745,1434,2745],["l",1484,2745],["l",1484,2811],["l",189,2811]]},"L":{"xoff":2688,"width":2496,"height":2816,"hbx":128,"hby":2816,"path":[["m",640,564],["q",640,321,518,196],["q",397,71,210,71],["l",165,71],["l",165,5],["l",2624,5],["l",2624,823],["l",2595,823],["q",2516,71,1694,71],["q",1347,71,1185,192],["q",1024,313,1024,568],["l",1024,2276],["q",1024,2745,1430,2745],["l",1479,2745],["l",1479,2811],["l",194,2811],["l",194,2745],["l",243,2745],["q",640,2745,640,2276],["l",640,564]]},"M":{"xoff":3840,"width":3648,"height":2880,"hbx":64,"hby":2816,"path":[["m",1906,571],["l",983,2811],["l",155,2811],["l",155,2745],["l",203,2745],["q",355,2745,427,2714],["q",500,2683,532,2580],["q",576,2435,576,1840],["l",576,555],["q",576,310,466,184],["q",357,59,171,59],["l",126,59],["l",126,-7],["l",1085,-7],["l",1085,59],["l",1040,59],["q",856,59,748,184],["q",640,310,640,555],["l",640,2625],["l",1718,-7],["l",1742,-7],["l",2816,2625],["l",2816,555],["q",2816,310,2694,184],["q",2572,59,2383,59],["l",2338,59],["l",2338,-7],["l",3687,-7],["l",3687,59],["l",3641,59],["q",3450,59,3325,184],["q",3200,310,3200,555],["q",3200,1609,3200,1840],["q",3200,2464,3245,2568],["q",3318,2745,3556,2745],["l",3605,2745],["l",3605,2811],["l",2812,2811],["l",1906,571]]},"N":{"xoff":3200,"width":3072,"height":2880,"hbx":64,"hby":2816,"path":[["m",878,2811],["l",133,2811],["l",133,2745],["l",182,2745],["q",576,2745,576,2286],["l",576,555],["q",576,310,463,184],["q",350,59,166,59],["l",121,59],["l",121,-7],["l",1087,-7],["l",1087,59],["l",1042,59],["q",857,59,748,184],["q",640,310,640,554],["l",640,2476],["l",2626,-39],["l",2678,-39],["l",2678,1834],["q",2678,2362,2760,2553],["q",2842,2745,3051,2745],["l",3083,2745],["l",3083,2811],["l",2170,2811],["l",2170,2745],["l",2203,2745],["q",2413,2745,2486,2559],["q",2560,2373,2560,1840],["l",2560,687],["l",878,2811]]},"O":{"xoff":3328,"width":2944,"height":2944,"hbx":192,"hby":2880,"path":[["m",625,2452],["q",192,2025,192,1436],["q",192,848,625,420],["q",1059,-7,1664,-7],["q",2269,-7,2702,420],["q",3136,848,3136,1436],["q",3136,2025,2702,2452],["q",2269,2880,1664,2880],["q",1059,2880,625,2452],["m",704,1434],["q",704,2009,980,2411],["q",1257,2814,1660,2814],["q",2067,2814,2345,2411],["q",2624,2009,2624,1434],["q",2624,863,2345,461],["q",2067,59,1660,59],["q",1257,59,980,461],["q",704,863,704,1434]]},"P":{"xoff":2624,"width":2304,"height":2880,"hbx":128,"hby":2816,"path":[["m",2432,2071],["q",2432,2410,2242,2610],["q",2052,2811,1675,2811],["l",193,2811],["l",193,2745],["l",242,2745],["q",640,2745,640,2273],["l",640,555],["q",640,310,517,184],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1521,-7],["l",1521,59],["l",1474,59],["q",1281,59,1152,183],["q",1024,308,1024,541],["l",1024,1337],["q",1298,1337,1445,1337],["q",1664,1337,1825,1364],["q",1986,1392,2131,1468],["q",2277,1544,2354,1695],["q",2432,1847,2432,2071],["m",1024,2745],["q",1222,2745,1335,2737],["q",1449,2729,1590,2693],["q",1731,2657,1805,2588],["q",1880,2520,1932,2392],["q",1984,2265,1984,2079],["q",1984,1865,1915,1723],["q",1847,1582,1718,1515],["q",1590,1448,1461,1425],["q",1332,1403,1157,1403],["q",1136,1403,1091,1403],["q",1046,1403,1024,1403],["l",1024,2745]]},"Q":{"xoff":3392,"width":3264,"height":3456,"hbx":192,"hby":2880,"path":[["m",192,1436],["q",192,827,626,410],["q",1061,-7,1737,-7],["q",1842,-144,1900,-212],["q",1959,-281,2076,-383],["q",2193,-485,2337,-530],["q",2481,-576,2657,-576],["q",2879,-576,3040,-499],["q",3201,-423,3278,-325],["q",3355,-228,3399,-86],["q",3443,55,3449,131],["q",3456,208,3456,297],["l",3392,297],["q",3392,91,3232,-82],["q",3073,-256,2746,-256],["q",2605,-256,2481,-203],["q",2357,-151,2288,-93],["q",2220,-35,2120,70],["q",2566,217,2851,595],["q",3136,974,3136,1435],["q",3136,2025,2702,2452],["q",2269,2880,1664,2880],["q",1059,2880,625,2452],["q",192,2025,192,1436],["m",704,1424],["q",704,2003,980,2408],["q",1257,2814,1660,2814],["q",2067,2814,2345,2410],["q",2624,2007,2624,1430],["q",2624,1001,2461,655],["q",2298,309,2027,153],["q",1898,261,1769,320],["q",1640,379,1455,379],["q",1184,379,1091,297],["q",910,486,807,782],["q",704,1079,704,1424],["m",1123,271],["q",1175,313,1297,313],["q",1401,313,1488,248],["q",1575,184,1684,59],["q",1361,59,1123,271]]},"R":{"xoff":3136,"width":3072,"height":2880,"hbx":128,"hby":2816,"path":[["m",1024,2745],["q",1222,2745,1335,2737],["q",1449,2729,1590,2693],["q",1731,2657,1805,2588],["q",1880,2520,1932,2392],["q",1984,2265,1984,2079],["q",1984,1865,1915,1723],["q",1847,1582,1718,1515],["q",1590,1448,1461,1425],["q",1332,1403,1157,1403],["q",1136,1403,1091,1403],["q",1046,1403,1024,1403],["l",1024,2745],["m",1024,1337],["q",1183,1337,1279,1337],["q",1376,1337,1470,1302],["q",1565,1268,1614,1237],["q",1664,1206,1741,1108],["q",1818,1010,1867,926],["q",1917,843,2025,659],["l",2406,-7],["l",3194,-7],["l",3194,59],["q",3026,59,2931,101],["q",2837,144,2724,279],["q",2612,414,2411,733],["q",2348,831,2275,960],["q",2202,1089,2170,1140],["q",2138,1191,2082,1252],["q",2026,1314,1959,1338],["q",1892,1363,1787,1379],["q",2118,1456,2275,1599],["q",2432,1742,2432,2071],["q",2432,2405,2238,2608],["q",2045,2811,1670,2811],["l",193,2811],["l",193,2745],["l",242,2745],["q",640,2745,640,2273],["l",640,555],["q",640,310,517,184],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1521,-7],["l",1521,59],["l",1474,59],["q",1281,59,1152,183],["q",1024,308,1024,541],["l",1024,1337]]},"S":{"xoff":2112,"width":1792,"height":2944,"hbx":192,"hby":2880,"path":[["m",1600,636],["q",1600,366,1458,212],["q",1317,59,1098,59],["q",904,59,746,130],["q",588,201,497,301],["q",406,402,340,516],["q",275,631,252,712],["q",229,793,229,832],["l",194,832],["l",194,0],["l",258,0],["q",258,134,382,134],["q",424,134,649,63],["q",874,-7,1094,-7],["q",1520,-7,1752,237],["q",1984,481,1984,838],["q",1984,1064,1881,1226],["q",1779,1388,1621,1471],["q",1463,1555,1280,1637],["q",1097,1719,941,1789],["q",785,1859,680,1994],["q",576,2130,576,2314],["q",576,2434,613,2525],["q",650,2617,703,2671],["q",756,2725,823,2759],["q",891,2794,946,2804],["q",1001,2814,1050,2814],["q",1254,2814,1423,2650],["q",1593,2487,1671,2315],["q",1749,2143,1749,2048],["l",1792,2048],["l",1792,2816],["l",1728,2816],["q",1728,2695,1587,2695],["q",1538,2695,1366,2787],["q",1194,2880,1028,2880],["q",722,2880,490,2663],["q",258,2446,258,2122],["q",258,1926,332,1783],["q",407,1640,525,1556],["q",643,1472,787,1404],["q",931,1336,1073,1274],["q",1215,1213,1333,1137],["q",1451,1062,1525,935],["q",1600,809,1600,636],["m",1105,962],["l",1105,962]]},"T":{"xoff":2880,"width":2880,"height":2816,"hbx":0,"hby":2752,"path":[["m",2815,2747],["l",65,2747],["l",7,2045],["l",65,2045],["q",89,2330,302,2505],["q",515,2681,900,2681],["l",1216,2681],["l",1216,548],["q",1216,307,1093,183],["q",970,59,782,59],["l",683,59],["l",683,-7],["l",2196,-7],["l",2196,59],["l",2098,59],["q",1909,59,1786,183],["q",1664,307,1664,548],["l",1664,2681],["l",1979,2681],["q",2364,2681,2577,2505],["q",2790,2330,2815,2045],["l",2872,2045],["l",2815,2747]]},"U":{"xoff":3200,"width":3072,"height":2880,"hbx":64,"hby":2816,"path":[["m",1738,954],["l",1738,954],["m",2570,942],["q",2570,504,2392,279],["q",2215,54,1781,54],["q",960,54,960,847],["l",960,2274],["q",960,2745,1362,2745],["l",1411,2745],["l",1411,2811],["l",125,2811],["l",125,2745],["l",175,2745],["q",576,2745,576,2274],["l",576,746],["q",576,287,838,111],["q",1100,-64,1696,-64],["q",2209,-64,2448,154],["q",2688,373,2688,845],["l",2688,1840],["q",2688,2365,2770,2555],["q",2852,2745,3061,2745],["l",3093,2745],["l",3093,2811],["l",2181,2811],["l",2181,2745],["l",2214,2745],["q",2426,2745,2498,2561],["q",2570,2378,2570,1841],["l",2570,942]]},"V":{"xoff":2816,"width":2944,"height":2880,"hbx":-64,"hby":2816,"path":[["m",-33,2811],["l",-33,2745],["l",16,2745],["q",85,2745,142,2734],["q",200,2724,242,2693],["q",285,2662,311,2643],["q",338,2625,369,2565],["q",400,2506,410,2487],["q",420,2468,449,2392],["q",478,2316,482,2299],["l",1393,-7],["l",1438,-7],["l",2324,2303],["q",2495,2745,2793,2745],["l",2826,2745],["l",2826,2811],["l",1922,2811],["l",1922,2745],["l",1954,2745],["q",2240,2745,2240,2460],["q",2240,2279,2077,1856],["l",1580,567],["l",1084,1836],["q",896,2324,896,2493],["q",896,2745,1226,2745],["l",1275,2745],["l",1275,2811],["l",-33,2811]]},"W":{"xoff":4480,"width":4608,"height":2880,"hbx":-64,"hby":2816,"path":[["m",3004,-7],["l",3049,-7],["l",3924,2164],["q",3981,2305,3997,2342],["q",4014,2380,4059,2477],["q",4104,2575,4133,2601],["q",4162,2628,4213,2674],["q",4264,2720,4323,2732],["q",4383,2745,4461,2745],["l",4493,2745],["l",4493,2811],["l",3569,2811],["l",3569,2745],["l",3601,2745],["q",3904,2745,3904,2466],["q",3904,2310,3785,2010],["l",3201,562],["l",2681,2164],["q",2624,2347,2624,2458],["q",2624,2745,2980,2745],["l",3029,2745],["l",3029,2811],["l",1749,2811],["l",1749,2745],["l",1798,2745],["q",1997,2745,2086,2633],["q",2176,2521,2176,2338],["q",2176,2193,2110,2010],["l",1627,562],["l",1054,2010],["q",896,2421,896,2525],["q",896,2745,1229,2745],["l",1278,2745],["l",1278,2811],["l",-9,2811],["l",-9,2745],["l",40,2745],["q",122,2745,197,2701],["q",272,2658,321,2608],["q",370,2558,425,2460],["q",481,2363,503,2315],["q",526,2267,566,2164],["l",1465,-7],["l",1510,-7],["l",2253,2230],["l",3004,-7]]},"X":{"xoff":2880,"width":3136,"height":2880,"hbx":-64,"hby":2816,"path":[["m",694,625],["q",690,621,643,557],["q",597,493,556,441],["q",516,390,445,313],["q",374,236,308,184],["q",243,133,160,96],["q",78,59,5,59],["l",-28,59],["l",-28,-7],["l",945,-7],["l",945,59],["l",913,59],["q",640,59,640,245],["q",640,431,889,753],["l",1303,1303],["l",1649,803],["q",1920,411,1920,249],["q",1920,59,1611,59],["l",1562,59],["l",1562,-7],["l",3016,-7],["l",3016,59],["l",2966,59],["q",2655,59,2269,609],["l",1558,1621],["l",2042,2217],["q",2046,2221,2100,2291],["q",2154,2361,2179,2390],["q",2204,2419,2266,2485],["q",2329,2551,2374,2586],["q",2420,2621,2484,2664],["q",2549,2708,2613,2726],["q",2678,2745,2741,2745],["l",2775,2745],["l",2775,2811],["l",1834,2811],["l",1834,2745],["l",1869,2745],["q",2144,2745,2144,2588],["q",2144,2448,1864,2108],["l",1513,1679],["l",1295,2001],["q",1024,2394,1024,2576],["q",1024,2745,1263,2745],["l",1312,2745],["l",1312,2811],["l",13,2811],["l",13,2745],["l",61,2745],["q",151,2745,228,2716],["q",305,2687,379,2608],["q",454,2530,489,2491],["q",524,2452,603,2330],["q",682,2208,690,2196],["l",1262,1357],["l",694,625]]},"Y":{"xoff":2688,"width":2944,"height":2880,"hbx":-128,"hby":2816,"path":[["m",2114,2092],["q",2255,2340,2429,2542],["q",2604,2745,2757,2745],["l",2790,2745],["l",2790,2811],["l",1892,2811],["l",1892,2745],["l",1924,2745],["q",2176,2745,2176,2526],["q",2176,2360,1967,1989],["l",1653,1430],["l",1565,1290],["q",1526,1352,1491,1410],["l",1060,2108],["q",864,2423,864,2547],["q",864,2745,1192,2745],["l",1244,2745],["l",1244,2811],["l",-87,2811],["l",-87,2745],["l",-37,2745],["q",63,2745,148,2703],["q",233,2662,307,2575],["q",381,2489,418,2431],["q",456,2373,522,2261],["l",990,1473],["q",1081,1315,1116,1207],["q",1152,1100,1152,931],["l",1152,555],["q",1152,310,1027,184],["q",903,59,709,59],["l",663,59],["l",663,-7],["l",2064,-7],["l",2064,59],["l",2020,59],["q",1840,59,1720,187],["q",1600,315,1600,555],["l",1600,931],["q",1600,1096,1634,1207],["q",1668,1319,1753,1468],["l",2114,2092]]},"Z":{"xoff":2944,"width":2496,"height":2816,"hbx":192,"hby":2752,"path":[["m",1436,920],["l",1436,920],["m",192,16],["l",192,-7],["l",2688,-7],["l",2688,846],["l",2663,846],["q",2592,503,2344,281],["q",2097,59,1754,59],["l",729,59],["l",2514,2711],["l",2514,2747],["l",324,2747],["l",254,2034],["l",308,2034],["q",489,2681,1151,2681],["l",2018,2681],["l",192,16]]},"[":{"xoff":1152,"width":704,"height":3328,"hbx":256,"hby":2816,"path":[["m",896,2806],["l",896,2688],["l",512,2688],["l",512,-392],["l",928,-392],["l",928,-512],["l",256,-512],["l",256,2806],["l",896,2806]]},"]":{"xoff":1088,"width":704,"height":3328,"hbx":64,"hby":2816,"path":[["m",142,2806],["l",142,2688],["l",512,2688],["l",512,-392],["l",96,-392],["l",96,-512],["l",768,-512],["l",768,2806],["l",142,2806]]},"^":{"xoff":1664,"width":1216,"height":2752,"hbx":192,"hby":2624,"path":[["m",803,-124],["l",803,-124],["m",1200,1920],["l",1364,1920],["l",897,2592],["l",709,2592],["l",242,1920],["l",406,1920],["l",803,2299],["l",1200,1920]]},"_":{"xoff":1856,"width":1856,"height":192,"hbx":0,"hby":-256,"path":[["m",0,-266],["l",0,-448],["l",1856,-448],["l",1856,-266],["l",0,-266]]},"`":{"xoff":1408,"width":960,"height":2752,"hbx":256,"hby":2752,"path":[["m",826,5],["l",826,5],["m",1010,2048],["l",1162,2048],["l",518,2667],["q",465,2720,404,2720],["q",338,2720,297,2677],["q",256,2635,256,2570],["q",256,2489,355,2429],["l",1010,2048]]},"a":{"xoff":1856,"width":1792,"height":1856,"hbx":128,"hby":1728,"path":[["m",851,-30],["l",851,-30],["m",128,356],["q",128,291,148,227],["q",169,164,221,91],["q",273,19,382,-26],["q",492,-71,650,-71],["q",994,-71,1127,107],["q",1247,-71,1528,-71],["q",1656,-71,1734,-40],["q",1813,-9,1834,18],["q",1856,46,1878,98],["l",1845,115],["q",1820,74,1804,53],["q",1788,32,1749,13],["q",1710,-5,1652,-5],["q",1542,-5,1511,81],["q",1480,168,1480,359],["l",1480,1239],["q",1480,1509,1302,1616],["q",1125,1723,812,1723],["q",610,1723,415,1638],["q",221,1554,221,1413],["q",221,1342,264,1297],["q",308,1252,374,1252],["q",502,1252,527,1404],["q",553,1554,617,1605],["q",681,1657,792,1657],["q",896,1657,968,1628],["q",1041,1600,1076,1561],["q",1111,1523,1131,1447],["q",1152,1372,1152,1321],["q",1152,1271,1152,1173],["q",1152,1055,1046,963],["q",941,872,792,848],["q",128,734,128,356],["m",747,-5],["q",620,-5,552,51],["q",485,107,470,171],["q",456,235,456,336],["q",456,452,534,548],["q",612,645,704,695],["q",796,745,943,811],["q",1090,877,1152,917],["l",1152,553],["q",1152,287,1066,141],["q",980,-5,747,-5]]},"b":{"xoff":2112,"width":1984,"height":2944,"hbx":64,"hby":2880,"path":[["m",539,109],["q",556,109,759,51],["q",963,-7,1122,-7],["q",1541,-7,1766,258],["q",1992,524,1992,922],["q",1992,1304,1742,1577],["q",1493,1851,1115,1851],["q",996,1851,879,1809],["q",763,1768,711,1733],["q",660,1698,640,1677],["l",640,2880],["l",605,2880],["q",185,2812,85,2804],["l",85,2760],["q",294,2760,339,2684],["q",384,2608,384,2312],["l",384,-7],["l",434,-7],["q",462,109,539,109],["m",640,922],["q",640,1390,719,1587],["q",798,1785,1067,1785],["q",1359,1785,1511,1542],["q",1664,1300,1664,922],["q",1664,561,1512,310],["q",1361,59,1062,59],["q",939,59,857,98],["q",775,138,730,196],["q",685,254,662,380],["q",640,507,640,613],["q",640,719,640,922]]},"c":{"xoff":1664,"width":1536,"height":1856,"hbx":128,"hby":1792,"path":[["m",980,1787],["q",607,1787,367,1516],["q",128,1246,128,861],["q",128,444,357,190],["q",587,-64,1016,-64],["q",1593,-64,1658,412],["l",1612,412],["q",1568,234,1462,144],["q",1357,54,1111,54],["q",456,54,456,865],["q",456,1230,597,1475],["q",739,1721,982,1721],["q",1147,1721,1200,1671],["q",1253,1622,1285,1457],["q",1313,1317,1455,1317],["q",1519,1317,1559,1358],["q",1600,1400,1600,1470],["q",1600,1626,1399,1706],["q",1199,1787,980,1787]]},"d":{"xoff":2176,"width":1984,"height":2944,"hbx":128,"hby":2880,"path":[["m",1527,1623],["q",1351,1851,1004,1851],["q",627,1851,377,1577],["q",128,1304,128,922],["q",128,524,355,258],["q",582,-7,1004,-7],["q",1335,-7,1507,227],["l",1531,-7],["l",1564,-7],["q",1686,24,1813,41],["q",1941,59,2010,59],["l",2078,59],["l",2078,123],["q",1898,123,1845,188],["q",1792,254,1792,471],["l",1792,2880],["l",1752,2880],["q",1331,2812,1229,2804],["l",1229,2760],["q",1437,2760,1482,2685],["q",1527,2611,1527,2320],["l",1527,1623],["m",1544,922],["q",1544,478,1427,268],["q",1310,59,1012,59],["q",807,59,678,189],["q",550,320,503,503],["q",456,686,456,922],["q",456,1312,589,1548],["q",722,1785,1012,1785],["q",1306,1785,1425,1573],["q",1544,1362,1544,922]]},"e":{"xoff":1856,"width":1664,"height":1856,"hbx":128,"hby":1792,"path":[["m",965,-3],["l",965,-3],["m",1728,1145],["q",1728,1462,1489,1624],["q",1251,1787,982,1787],["q",605,1787,366,1516],["q",128,1246,128,861],["q",128,444,362,190],["q",596,-64,1036,-64],["q",1350,-64,1528,65],["q",1706,194,1753,404],["l",1706,404],["q",1632,230,1505,142],["q",1378,54,1129,54],["q",456,54,456,843],["q",456,1008,468,1145],["l",1728,1145],["m",974,1721],["q",1195,1721,1297,1595],["q",1400,1470,1400,1211],["l",477,1211],["q",510,1458,624,1589],["q",739,1721,974,1721]]},"f":{"xoff":1152,"width":1344,"height":2944,"hbx":128,"hby":2880,"path":[["m",128,1657],["l",448,1657],["l",448,553],["q",448,257,401,158],["q",355,59,173,59],["l",173,-7],["l",1003,-7],["l",1003,59],["q",799,59,751,151],["q",704,244,704,553],["l",704,1657],["l",1216,1657],["l",1216,1723],["l",704,1723],["l",704,2250],["q",704,2814,975,2814],["q",1047,2814,1088,2783],["q",1130,2752,1193,2621],["q",1197,2613,1211,2582],["q",1226,2551,1230,2542],["q",1234,2534,1249,2513],["q",1264,2493,1274,2487],["q",1284,2481,1303,2474],["q",1322,2468,1342,2468],["q",1472,2468,1472,2607],["q",1472,2683,1417,2741],["q",1362,2800,1278,2826],["q",1194,2853,1118,2866],["q",1042,2880,985,2880],["q",833,2880,724,2833],["q",616,2787,563,2728],["q",510,2669,483,2566],["q",457,2464,452,2409],["q",448,2354,448,2265],["l",448,1723],["l",128,1723],["l",128,1657]]},"g":{"xoff":1792,"width":1728,"height":2624,"hbx":128,"hby":1792,"path":[["m",1496,1721],["q",1568,1721,1608,1649],["q",1668,1549,1752,1549],["q",1856,1549,1856,1645],["q",1856,1710,1792,1748],["q",1728,1787,1624,1787],["q",1448,1787,1272,1666],["q",1087,1787,873,1787],["q",625,1787,435,1607],["q",246,1427,246,1188],["q",246,1014,358,876],["q",471,739,635,683],["q",417,648,331,543],["q",246,439,246,333],["q",246,195,363,97],["q",481,0,666,0],["l",966,0],["q",1472,0,1472,-334],["q",1472,-358,1463,-395],["q",1455,-432,1420,-499],["q",1386,-567,1328,-624],["q",1270,-682,1149,-724],["q",1028,-766,872,-766],["q",543,-766,395,-641],["q",247,-516,247,-377],["q",247,-238,302,-183],["q",357,-128,423,-128],["q",506,-128,550,-160],["q",594,-193,594,-230],["q",639,-209,639,-145],["q",639,-91,576,-50],["q",514,-10,412,-10],["q",318,-10,223,-87],["q",128,-165,128,-348],["q",128,-527,253,-641],["q",378,-756,531,-794],["q",684,-832,869,-832],["q",975,-832,1100,-807],["q",1225,-783,1376,-724],["q",1527,-666,1627,-541],["q",1728,-416,1728,-244],["q",1728,-18,1555,119],["q",1382,256,1105,256],["l",726,256],["q",384,256,384,433],["q",384,532,518,593],["q",652,654,729,641],["q",778,633,851,633],["q",1099,633,1285,797],["q",1472,962,1472,1204],["q",1472,1441,1312,1633],["q",1340,1666,1400,1693],["q",1460,1721,1496,1721],["m",574,1208],["q",574,1721,887,1721],["q",1216,1721,1216,1208],["q",1216,699,887,699],["q",574,699,574,1208]]},"h":{"xoff":2240,"width":2048,"height":2880,"hbx":128,"hby":2880,"path":[["m",448,559],["q",448,259,401,159],["q",354,59,169,59],["l",169,5],["l",974,5],["l",974,59],["q",790,59,747,154],["q",704,250,704,570],["l",704,1086],["q",704,1423,774,1537],["q",839,1639,952,1712],["q",1065,1785,1195,1785],["q",1600,1785,1600,1299],["l",1600,570],["q",1600,263,1553,161],["q",1506,59,1322,59],["l",1322,5],["l",2126,5],["l",2126,59],["q",1942,59,1899,154],["q",1856,250,1856,569],["l",1856,1297],["q",1856,1633,1720,1742],["q",1585,1851,1318,1851],["q",894,1851,704,1572],["l",704,2880],["l",669,2880],["q",245,2812,145,2804],["l",145,2760],["q",346,2760,397,2691],["q",448,2623,448,2359],["l",448,559]]},"i":{"xoff":1088,"width":896,"height":2816,"hbx":128,"hby":2880,"path":[["m",448,616],["q",448,316,404,219],["q",361,123,175,123],["l",175,69],["l",962,69],["l",962,123],["q",784,123,744,213],["q",704,303,704,617],["l",704,1868],["l",665,1868],["q",251,1797,151,1789],["l",151,1744],["q",353,1744,400,1676],["q",448,1608,448,1349],["l",448,616],["m",430,2833],["q",384,2786,384,2718],["q",384,2651,430,2605],["q",476,2560,546,2560],["q",616,2560,664,2605],["q",712,2651,712,2718],["q",712,2786,664,2833],["q",616,2880,546,2880],["q",476,2880,430,2833]]},"j":{"xoff":1024,"width":1088,"height":3584,"hbx":-320,"hby":2880,"path":[["m",430,2833],["q",384,2786,384,2718],["q",384,2651,430,2605],["q",476,2560,545,2560],["q",615,2560,663,2605],["q",712,2651,712,2718],["q",712,2786,663,2833],["q",615,2880,545,2880],["q",476,2880,430,2833],["m",448,-52],["q",448,-396,396,-523],["q",344,-650,160,-650],["q",60,-650,8,-594],["q",-44,-539,-54,-471],["q",-65,-404,-100,-349],["q",-136,-294,-207,-294],["q",-320,-294,-320,-421],["q",-320,-515,-236,-580],["q",-152,-645,-57,-669],["q",37,-694,114,-694],["q",704,-694,704,91],["l",704,1872],["l",665,1872],["q",256,1802,153,1794],["l",153,1749],["q",354,1749,401,1675],["q",448,1602,448,1356],["l",448,-52]]},"k":{"xoff":1920,"width":2176,"height":2880,"hbx":64,"hby":2880,"path":[["m",384,558],["q",384,259,337,159],["q",290,59,106,59],["l",106,5],["l",911,5],["l",911,59],["q",726,59,683,153],["q",640,248,640,564],["l",640,787],["l",780,922],["l",1084,589],["q",1121,548,1172,490],["q",1223,433,1248,408],["q",1273,383,1304,347],["q",1335,311,1347,288],["q",1359,265,1367,237],["q",1376,210,1376,180],["q",1376,101,1331,80],["q",1286,59,1178,59],["l",1145,59],["l",1145,5],["l",2203,5],["l",2203,59],["l",2097,59],["q",1916,59,1657,350],["l",960,1098],["l",1285,1414],["q",1605,1721,1785,1721],["l",1818,1721],["l",1818,1787],["l",1018,1787],["l",1018,1721],["l",1051,1721],["q",1149,1721,1198,1675],["q",1248,1629,1248,1566],["q",1248,1460,1088,1309],["l",640,871],["l",640,2880],["l",605,2880],["q",185,2811,85,2803],["l",85,2762],["q",282,2762,333,2691],["q",384,2621,384,2362],["l",384,558]]},"l":{"xoff":1024,"width":896,"height":2880,"hbx":64,"hby":2880,"path":[["m",384,558],["q",384,259,337,159],["q",290,59,105,59],["l",105,5],["l",911,5],["l",911,59],["q",726,59,683,152],["q",640,245,640,558],["l",640,2880],["l",605,2880],["q",185,2809,85,2801],["l",85,2755],["q",286,2755,335,2686],["q",384,2618,384,2355],["l",384,558]]},"m":{"xoff":3392,"width":3200,"height":1920,"hbx":128,"hby":1856,"path":[["m",448,552],["q",448,256,401,157],["q",354,59,170,59],["l",170,-7],["l",974,-7],["l",974,59],["q",790,59,747,151],["q",704,243,704,551],["l",704,1048],["q",704,1376,773,1482],["q",839,1581,951,1651],["q",1064,1721,1194,1721],["q",1600,1721,1600,1253],["l",1600,551],["q",1600,256,1553,157],["q",1506,59,1322,59],["l",1322,-7],["l",2123,-7],["l",2123,59],["q",1938,59,1897,149],["q",1856,239,1856,551],["l",1856,1048],["q",1856,1363,1913,1466],["q",1971,1569,2092,1645],["q",2213,1721,2345,1721],["q",2752,1721,2752,1253],["l",2752,551],["q",2752,256,2705,157],["q",2658,59,2473,59],["l",2473,-7],["l",3279,-7],["l",3279,59],["q",3094,59,3051,151],["q",3008,243,3008,551],["l",3008,1253],["q",3008,1425,2967,1536],["q",2927,1647,2844,1698],["q",2761,1750,2672,1768],["q",2583,1787,2449,1787],["q",2202,1787,2066,1702],["q",1931,1618,1829,1478],["q",1788,1663,1658,1725],["q",1529,1787,1311,1787],["q",902,1787,704,1515],["l",684,1787],["l",657,1799],["q",397,1750,149,1721],["l",149,1675],["q",362,1675,405,1611],["q",448,1547,448,1264],["l",448,552]]},"n":{"xoff":2240,"width":2048,"height":1920,"hbx":128,"hby":1856,"path":[["m",448,552],["q",448,256,401,157],["q",354,59,170,59],["l",170,-7],["l",974,-7],["l",974,59],["q",790,59,747,151],["q",704,243,704,551],["l",704,1060],["q",704,1376,773,1482],["q",839,1581,951,1651],["q",1064,1721,1194,1721],["q",1600,1721,1600,1253],["l",1600,551],["q",1600,256,1553,157],["q",1506,59,1322,59],["l",1322,-7],["l",2126,-7],["l",2126,59],["q",1942,59,1899,151],["q",1856,243,1856,551],["l",1856,1253],["q",1856,1581,1721,1684],["q",1586,1787,1318,1787],["q",906,1787,704,1515],["l",684,1787],["l",657,1799],["q",397,1750,149,1721],["l",149,1675],["q",362,1675,405,1609],["q",448,1543,448,1268],["l",448,552]]},"o":{"xoff":2112,"width":1856,"height":1920,"hbx":128,"hby":1792,"path":[["m",1056,-13],["l",1056,-13],["m",402,1511],["q",128,1236,128,858],["q",128,480,402,204],["q",676,-71,1056,-71],["q",1436,-71,1710,204],["q",1984,480,1984,858],["q",1984,1236,1710,1511],["q",1436,1787,1056,1787],["q",676,1787,402,1511],["m",631,248],["q",456,501,456,858],["q",456,1215,631,1468],["q",807,1721,1056,1721],["q",1309,1721,1482,1470],["q",1656,1219,1656,858],["q",1656,497,1482,246],["q",1309,-5,1056,-5],["q",807,-5,631,248]]},"p":{"xoff":2240,"width":1984,"height":2688,"hbx":64,"hby":1856,"path":[["m",640,858],["q",640,1260,759,1490],["q",878,1721,1116,1721],["q",1411,1721,1565,1478],["q",1720,1236,1720,858],["q",1720,497,1567,246],["q",1415,-5,1116,-5],["q",833,-5,736,198],["q",640,402,640,858],["m",657,1824],["l",615,1824],["q",192,1732,89,1721],["l",89,1675],["q",290,1675,337,1607],["q",384,1540,384,1281],["l",384,-286],["q",384,-585,335,-681],["q",286,-778,81,-778],["l",81,-832],["l",940,-832],["l",940,-778],["q",743,-778,700,-621],["q",657,-464,657,148],["q",763,37,872,-17],["q",981,-71,1170,-71],["q",1593,-71,1820,194],["q",2048,460,2048,858],["q",2048,1240,1796,1513],["q",1544,1787,1165,1787],["q",846,1787,657,1551],["l",657,1824]]},"q":{"xoff":2176,"width":1984,"height":2688,"hbx":128,"hby":1856,"path":[["m",1565,1631],["q",1524,1631,1460,1670],["q",1397,1709,1284,1748],["q",1171,1787,1007,1787],["q",629,1787,378,1518],["q",128,1249,128,874],["q",128,487,380,208],["q",633,-71,1043,-71],["q",1335,-71,1519,133],["q",1519,-483,1476,-630],["q",1433,-778,1236,-778],["l",1236,-832],["l",2095,-832],["l",2095,-778],["q",1890,-778,1841,-680],["q",1792,-583,1792,-281],["l",1792,1824],["l",1734,1824],["q",1697,1631,1565,1631],["m",1536,874],["q",1536,647,1519,502],["q",1503,358,1456,233],["q",1409,109,1312,52],["q",1215,-5,1060,-5],["q",761,-5,608,255],["q",456,516,456,874],["q",456,1245,610,1483],["q",765,1721,1060,1721],["q",1343,1721,1439,1511],["q",1536,1301,1536,874]]},"r":{"xoff":1472,"width":1408,"height":1920,"hbx":64,"hby":1856,"path":[["m",621,1803],["l",593,1815],["q",333,1765,85,1736],["l",85,1689],["q",298,1689,341,1622],["q",384,1556,384,1278],["l",384,556],["q",384,258,337,158],["q",290,59,105,59],["l",105,-7],["l",918,-7],["l",918,59],["q",728,59,684,151],["q",640,244,640,555],["l",640,1160],["q",640,1383,700,1479],["q",808,1664,969,1664],["q",1044,1664,1092,1629],["q",1141,1594,1160,1550],["q",1179,1507,1214,1471],["q",1250,1436,1304,1436],["q",1364,1436,1402,1482],["q",1440,1528,1440,1586],["q",1440,1665,1364,1723],["q",1288,1782,1158,1782],["q",834,1782,640,1527],["l",621,1803]]},"s":{"xoff":1536,"width":1152,"height":1920,"hbx":192,"hby":1792,"path":[["m",768,-13],["l",768,-13],["m",1088,289],["q",1088,149,998,72],["q",909,-5,780,-5],["q",629,-5,514,67],["q",400,140,343,241],["q",287,343,262,419],["q",237,496,233,533],["l",224,533],["l",224,-42],["l",281,-42],["q",281,-17,309,3],["q",338,24,387,24],["q",436,24,543,-23],["q",650,-71,781,-71],["q",1048,-71,1196,90],["q",1344,252,1344,434],["q",1344,616,1251,742],["q",1159,868,1028,934],["q",897,1000,765,1060],["q",634,1121,541,1216],["q",448,1311,448,1447],["q",448,1539,478,1599],["q",509,1659,556,1681],["q",603,1704,635,1712],["q",668,1721,698,1721],["q",865,1721,976,1545],["q",1088,1369,1088,1257],["l",1152,1257],["l",1152,1787],["l",1088,1787],["q",1088,1688,1020,1688],["q",997,1688,889,1737],["q",782,1787,698,1787],["q",543,1787,399,1664],["q",256,1542,256,1310],["q",256,1136,342,1015],["q",429,895,549,830],["q",669,766,792,704],["q",915,642,1001,540],["q",1088,439,1088,289]]},"t":{"xoff":1280,"width":1152,"height":2432,"hbx":192,"hby":2304,"path":[["m",376,342],["q",376,127,493,23],["q",610,-81,830,-81],["q",942,-81,1027,-64],["q",1112,-47,1161,-16],["q",1211,14,1237,37],["q",1264,60,1285,94],["l",1306,132],["l",1274,153],["q",1173,-15,965,-15],["q",813,-15,758,102],["q",704,220,704,518],["l",704,1657],["l",1216,1657],["l",1216,1723],["l",704,1723],["l",704,2255],["l",658,2255],["q",618,2030,521,1889],["q",424,1748,192,1715],["l",192,1657],["l",376,1657],["l",376,342]]},"u":{"xoff":2240,"width":2048,"height":1856,"hbx":64,"hby":1728,"path":[["m",1098,-13],["l",1098,-13],["m",640,1723],["l",93,1723],["l",93,1657],["q",285,1657,334,1563],["q",384,1469,384,1166],["l",384,474],["q",384,294,432,177],["q",481,60,577,11],["q",674,-38,763,-54],["q",853,-71,990,-71],["q",1378,-71,1536,159],["l",1551,-54],["l",1579,-67],["q",1839,-46,2087,-17],["l",2087,28],["q",1878,28,1835,90],["q",1792,152,1792,433],["l",1792,1723],["l",1270,1723],["l",1270,1657],["q",1454,1657,1495,1567],["q",1536,1478,1536,1166],["l",1536,622],["q",1536,270,1466,179],["q",1323,-5,1021,-5],["q",849,-5,744,113],["q",640,231,640,477],["l",640,1723]]},"v":{"xoff":1856,"width":1984,"height":1856,"hbx":-64,"hby":1728,"path":[["m",-11,1723],["l",-11,1657],["l",22,1657],["q",91,1657,142,1638],["q",194,1620,228,1570],["q",262,1520,278,1487],["q",295,1454,328,1374],["l",909,-71],["l",942,-71],["l",1428,1075],["q",1436,1096,1462,1160],["q",1489,1225,1507,1266],["q",1526,1308,1559,1374],["q",1592,1441,1620,1484],["q",1649,1528,1685,1572],["q",1722,1616,1763,1636],["q",1804,1657,1849,1657],["l",1869,1657],["l",1869,1723],["l",1244,1723],["l",1244,1657],["l",1264,1657],["q",1354,1657,1413,1594],["q",1472,1532,1472,1429],["q",1472,1329,1362,1075],["l",1052,336],["l",754,1084],["q",640,1366,640,1470],["q",640,1549,709,1603],["q",779,1657,873,1657],["l",901,1657],["l",901,1723],["l",-11,1723]]},"w":{"xoff":2688,"width":2752,"height":1856,"hbx":-64,"hby":1728,"path":[["m",1493,1723],["l",1440,1723],["l",1022,407],["l",754,1084],["q",640,1366,640,1470],["q",640,1549,709,1603],["q",779,1657,872,1657],["l",900,1657],["l",900,1723],["l",-11,1723],["l",-11,1657],["l",22,1657],["q",91,1657,142,1636],["q",194,1616,228,1570],["q",262,1524,280,1484],["q",299,1445,328,1374],["l",900,-71],["l",928,-71],["l",1350,1229],["l",1773,-71],["l",1801,-71],["l",2233,1075],["q",2449,1657,2649,1657],["l",2669,1657],["l",2669,1723],["l",2045,1723],["l",2045,1657],["l",2066,1657],["q",2151,1657,2211,1596],["q",2272,1536,2272,1440],["q",2272,1345,2166,1076],["l",1915,407],["l",1493,1723]]},"x":{"xoff":1856,"width":1984,"height":1792,"hbx":-64,"hby":1728,"path":[["m",512,249],["q",512,354,633,523],["l",820,783],["l",1072,430],["q",1184,269,1184,188],["q",1184,59,1016,59],["l",984,59],["l",984,-7],["l",1907,-7],["l",1907,59],["l",1882,59],["q",1833,59,1786,75],["q",1739,91,1706,107],["q",1673,124,1636,162],["q",1600,200,1585,220],["q",1571,240,1538,287],["q",1505,334,1497,342],["l",988,1014],["l",1259,1337],["q",1526,1657,1727,1657],["l",1759,1657],["l",1759,1723],["l",1040,1723],["l",1040,1657],["l",1072,1657],["q",1173,1657,1226,1613],["q",1280,1569,1280,1508],["q",1280,1419,1133,1248],["l",964,1050],["l",736,1358],["q",640,1480,640,1540],["q",640,1588,694,1622],["q",748,1657,812,1657],["l",844,1657],["l",844,1723],["l",4,1723],["l",4,1657],["l",41,1657],["q",108,1657,171,1619],["q",235,1581,264,1550],["q",293,1520,349,1437],["q",405,1354,409,1350],["l",796,816],["l",466,379],["q",223,59,8,59],["l",-24,59],["l",-24,-7],["l",788,-7],["l",788,59],["l",754,59],["q",617,59,564,103],["q",512,147,512,249]]},"y":{"xoff":1920,"width":1984,"height":2560,"hbx":0,"hby":1728,"path":[["m",1107,2],["l",1107,2],["m",1119,299],["l",782,1104],["q",672,1377,672,1477],["q",672,1553,737,1605],["q",802,1657,890,1657],["l",917,1657],["l",917,1723],["l",11,1723],["l",11,1657],["l",43,1657],["q",112,1657,160,1637],["q",209,1617,246,1571],["q",283,1525,301,1491],["q",319,1457,347,1384],["l",928,6],["q",928,-166,823,-383],["q",791,-456,713,-516],["q",636,-576,559,-576],["q",532,-576,485,-559],["q",439,-543,398,-543],["q",256,-543,256,-670],["q",256,-728,307,-780],["q",359,-832,445,-832],["q",715,-832,903,-381],["l",1523,1089],["q",1765,1657,1945,1657],["l",1965,1657],["l",1965,1723],["l",1335,1723],["l",1335,1657],["l",1355,1657],["q",1447,1657,1507,1597],["q",1568,1537,1568,1437],["q",1568,1356,1460,1096],["l",1119,299]]},"z":{"xoff":1920,"width":1664,"height":1792,"hbx":128,"hby":1728,"path":[["m",1004,-7],["l",1004,-7],["m",507,59],["l",1664,1668],["l",1664,1723],["l",299,1723],["l",246,1214],["l",291,1214],["q",356,1468,468,1562],["q",581,1657,845,1657],["l",1289,1657],["l",128,48],["l",128,-7],["l",1726,-7],["l",1783,582],["l",1738,582],["q",1672,260,1507,159],["q",1342,59,820,59],["l",507,59]]},"{":{"xoff":1280,"width":1024,"height":3584,"hbx":64,"hby":2752,"path":[["m",1059,2747],["q",1088,2747,1088,2714],["q",1088,2681,1058,2681],["q",1054,2681,1006,2683],["q",958,2686,938,2681],["q",821,2681,730,2610],["q",640,2539,640,2438],["q",640,2259,688,2017],["q",736,1776,744,1684],["q",769,1436,637,1229],["q",505,1022,349,1022],["q",337,1022,337,1011],["q",337,1000,349,1000],["q",505,1000,620,828],["q",736,656,736,419],["q",736,287,688,13],["q",640,-260,640,-408],["q",640,-527,713,-612],["q",786,-697,904,-709],["q",938,-709,959,-709],["q",980,-709,1002,-709],["q",1025,-709,1033,-709],["q",1056,-709,1056,-740],["q",1056,-775,1024,-775],["q",887,-775,814,-775],["q",613,-775,498,-622],["q",384,-469,384,-256],["q",384,-42,427,245],["q",470,533,474,586],["q",515,960,183,960],["q",175,960,148,960],["q",122,960,109,960],["q",64,960,64,1021],["q",64,1078,109,1078],["q",122,1078,148,1078],["q",175,1078,183,1078],["q",499,1078,499,1401],["q",499,1487,441,1775],["q",384,2064,384,2182],["q",384,2420,524,2583],["q",665,2747,885,2747],["q",947,2747,1059,2747]]},"|":{"xoff":960,"width":192,"height":3648,"hbx":384,"hby":2944,"path":[["m",384,2944],["l",384,-704],["l",576,-704],["l",576,2944],["l",384,2944]]},"}":{"xoff":1280,"width":1024,"height":3648,"hbx":64,"hby":2816,"path":[["m",97,2799],["q",64,2799,64,2740],["q",64,2681,97,2681],["q",105,2681,147,2681],["q",190,2681,211,2681],["q",329,2681,420,2609],["q",512,2538,512,2436],["q",512,2250,468,2000],["q",425,1751,416,1676],["q",392,1426,519,1219],["q",647,1012,802,1012],["q",819,1012,819,1006],["q",819,1000,807,1000],["q",651,1000,538,826],["q",425,652,441,412],["q",441,264,476,-7],["q",512,-279,512,-410],["q",512,-528,438,-612],["q",365,-697,255,-709],["q",218,-709,195,-709],["q",172,-709,145,-709],["q",118,-709,113,-709],["q",85,-709,85,-740],["q",85,-775,118,-775],["q",257,-775,331,-775],["q",534,-775,651,-622],["q",768,-469,768,-256],["q",768,-42,725,245],["q",682,533,677,586],["q",661,771,724,865],["q",788,960,969,960],["q",982,960,1006,960],["q",1031,960,1043,960],["q",1088,960,1088,1021],["q",1088,1078,1043,1078],["q",1031,1078,1004,1078],["q",978,1078,970,1078],["q",652,1078,652,1401],["q",652,1495,710,1783],["q",768,2072,768,2182],["q",768,2420,626,2583],["q",484,2747,267,2747],["q",209,2799,97,2799]]},"~":{"xoff":1408,"width":1216,"height":384,"hbx":64,"hby":1088,"path":[["m",1216,1078],["q",1216,1004,1153,950],["q",1090,896,964,896],["q",890,896,702,992],["q",515,1088,397,1088],["q",280,1088,172,987],["q",64,886,64,727],["l",145,727],["q",149,747,161,775],["q",173,804,222,850],["q",272,896,336,896],["q",443,896,628,800],["q",814,704,937,704],["q",1077,704,1178,817],["q",1280,931,1280,1068],["l",1216,1078]]}},"exporter":"SimpleJson","version":"0.0.3"};

},{}],7:[function(require,module,exports){
var util = require('fontpath-util');
var Matrix3 = require('vecmath').Matrix3;
var Vector3 = require('vecmath').Vector3;

var tmpVec = new Vector3();

/**
 * Prepares a Matrix3 from the given font and glyph info, which
 * is expected to be in the form of fontpath output, i.e.:
 *
 * { resolution, size, units_per_EM }
 *
 * You can transform a 2D pixel-space point by this matrix and
 * it will line the glyph up to match Canvas fillText rendering
 * (i.e. lower-left origin for text rendering). 
 *
 * If no `outMatrix` is specified, a new Matrix3 will be created.
 * 
 * @param  {Number} font      the font object which defines resolution, size, and units_per_em
 * @param  {Number} glyph     the glyph object from fontpath output
 * @param  {Number} fontSize  the desired font size, or defaults to font.size
 * @param  {Number} x         the desired x position in pixel space, defaults to 0
 * @param  {Number} y         the desired y position in pixel space, defaults to 0
 * @param  {Matrix3} outMatrix the output matrix to use
 * @return {Matrix3}           the output matrix
 */
module.exports.toGlyphMatrix3 = function(font, glyph, fontSize, x, y, outMatrix) {
	fontSize = fontSize||fontSize===0 ? fontSize : font.size;
	x = x||0;
	y = y||0;

	var pxSize = util.pointsToPixels(fontSize, font.resolution);

	var pointScale = (32/font.size) * pxSize / font.units_per_EM;

	if (!outMatrix)
		outMatrix = new Matrix3();
	else
		outMatrix.idt();
	outMatrix.translate( tmpVec.set(x, y) );
	outMatrix.scale( tmpVec.set(pointScale, -pointScale) );
	outMatrix.translate( tmpVec.set(-glyph.hbx, 0) );
	return outMatrix;
}
},{"fontpath-util":8,"vecmath":19}],8:[function(require,module,exports){
module.exports.pointsToPixels = function(pointSize, resolution) {
	resolution = typeof resolution === "number" ? resolution : 72;
	return pointSize * resolution / 72;
};

module.exports.coordToPixel = function(coord, pixelSize, emSize) {
	emSize = typeof emSize === "number" ? emSize : 2048;
	return coord * pixelSize / emSize;
};
},{}],9:[function(require,module,exports){
var Vector2 = require('vecmath/lib/Vector2');
var Class = require('klasse');
var lerp = require('interpolation').lerp;

function distanceTo(x1, y1, x2, y2) {
    var dx = x2-x1;
    var dy = y2-y1;
    return Math.sqrt(dx*dx+dy*dy);
}

var tmp1 = new Vector2();
var tmp2 = new Vector2();

var Shape = new Class({

    initialize: function() {
        this.steps = 1;
        this.points = [];

        // If step is not provided to a ***CurveTo function, 
        // then it will be approximated with a very simple distance check
        this.approximateCurves = true;
        this.approximationFactor = 0.5;

        this._move = new Vector2();
        this._start = new Vector2();
        this._hasMoved = false;
        this._newPath = true;
    },


    reset: function() {
        this.points.length = 0;
        this._newPath = true;
        this._hasMoved = false;
        this._move.x = this._move.y = 0;
        this._start.x = this._start.y = 0;
    },

    beginPath: function() {
        this.reset();
    },
    
    moveTo: function(x, y) {
        this._newPath = true;
        this._move.x = x;
        this._move.y = y;
        this._start.x = x;
        this._start.y = y;
        this._hasMoved = true;
    },

    __newPoint: function(nx, ny) {
        this.points.push(new Vector2(nx, ny));
        this._newPath = false;
    },
    
    /** Closes the path by performing a lineTo with the first 'starting' point. 
        If the path is empty, this does nothing. */
    closePath: function(steps) {
        if (this.points.length===0)
            return;
        this.lineTo(this._start.x, this._start.y, steps);
    },
    
    lineTo: function(x, y, steps) {
        //if we are calling lineTo before any moveTo.. make this the first point
        if (!this._hasMoved) {
            this.moveTo(x, y);
            return;
        }

        steps = Math.max(1, steps || this.steps);
        for (var i=0; i<=steps; i++) { 
            if (!this._newPath && i==0)
                continue;
                
            var t = i/steps;   
            var nx = lerp(this._move.x, x, t);
            var ny = lerp(this._move.y, y, t);
            
            this.__newPoint(nx, ny);
        }
        this._move.x = x;
        this._move.y = y; 
    },

    /** Creates a bezier (cubic) curve to the specified point, with the given control points.
    If steps is not specified or is a falsy value, this function will use the default value
    set for this Path object. It will be capped to a minimum of 3 steps. 
    */
    bezierCurveTo: function(x2, y2, x3, y3, x4, y4, steps) {
        //if we are calling bezierCurveTo before any moveTo.. the control point takes the lead
        //this is how it works with HTML5 canvas context
        if (!this._hasMoved) {
            this.moveTo(x2, y2);
        }
        
        var x1 = this._move.x;
        var y1 = this._move.y;
        
        //try to approximate with a simple distance sum.
        //more accurate would be to use this:
        //http://antigrain.com/research/adaptive_bezier/
        if (!steps) {
            if (this.approximateCurves) {
                var d1 = distanceTo(x1, y1, x2, y2);
                var d2 = distanceTo(x2, y2, x3, y3);
                var d3 = distanceTo(x3, y3, x4, y4);
                steps = ~~((d1 + d2 + d3) * this.approximationFactor);
            } else {
                steps = Math.max(1, this.steps);
            }
        } 
        
        for (var i=0; i<steps; i++) {
            var t = i / (steps-1);
            var dt = (1 - t);
            
            var dt2 = dt * dt;
            var dt3 = dt2 * dt;
            var t2 = t * t;
            var t3 = t2 * t;
            
            var x = dt3 * x1 + 3 * dt2 * t * x2 + 3 * dt * t2 * x3 + t3 * x4;
            var y = dt3 * y1 + 3 * dt2 * t * y2 + 3 * dt * t2 * y3 + t3 * y4;
            
            this.__newPoint(x, y);
        }
        
        this._move.x = x4;
        this._move.y = y4;
    },
    
    /** Creates a quadratic curve to the specified point, with the given control points.
    If steps is not specified or is a falsy value, this function will use the default value
    set for this Path object. It will be capped to a minimum of 3 steps. 
    */
    quadraticCurveTo: function(x2, y2, x3, y3, steps) {
        //parity with HTML5 canvas context, just move to first control point
        if (!this._hasMoved) {
            this.moveTo(x2, y2);
        } 
        
        var x1 = this._move.x;
        var y1 = this._move.y;
        
        //try to approximate with a simple distance sum.
        //more accurate would be to use this:
        //http://antigrain.com/research/adaptive_bezier/
        if (!steps) {
            if (this.approximateCurves) {
                var d1 = tmp1.set(x1, y1).distance( tmp2.set(x2, y2) );
                var d2 = tmp1.set(x2, y2).distance( tmp2.set(x3, y3) );
                steps = ~~((d1 + d2) * this.approximationFactor);
            } else {
                steps = Math.max(1, this.steps);
            }
        } 
        
        for (var i=0; i<steps; i++) {
            var t = i / (steps-1);
            var dt = (1 - t);
            var dtSq = dt * dt;
            var tSq = t * t;
            
            var x = dtSq * x1 + 2 * dt * t * x2 + tSq * x3;
            var y = dtSq * y1 + 2 * dt * t * y2 + tSq * y3;
            
            this.__newPoint(x, y);
        }
        
        this._move.x = x3;
        this._move.y = y3;
    },

    calculateBoundingBox: function() {
        var points = this.points;

        var minX = Number.MAX_VALUE,
            minY = Number.MAX_VALUE,
            maxX = -Number.MAX_VALUE,
            maxY = -Number.MAX_VALUE;

        for (var i=0; i<points.length; i++) {
            var p = points[i];

            minX = Math.min(minX, p.x);
            minY = Math.min(minY, p.y);
            maxX = Math.max(maxX, p.x);
            maxY = Math.max(maxY, p.y);
        }

        return {
            x: minX,
            y: minY,
            width: maxX-minX,
            height: maxY-minY
        };
    },

    contains: function(x, y) {
        var testx = x, testy = y;
        if (typeof x === "object") {
            testx = x.x;
            testy = x.y;
        }

        var points = this.points;
        var nvert = points.length;
        var i, j, c = 0;
        for (i=0, j=nvert-1; i<nvert; j=i++) {
            if ( ((points[i].y>testy) != (points[j].y>testy)) &&
                (testx < (points[j].x-points[i].x) * (testy-points[i].y) / (points[j].y-points[i].y) + points[i].x) ) {
                c = !c;
            }
        }
        return c;
    },


    simplify: function(tolerance, out) {
        var points = this.points,
            len = points.length,
            point = new Vector2(),
            sqTolerance = tolerance*tolerance,
            prevPoint = new Vector2( points[0] );

        if (!out)
            out = new Shape();

        var outPoints = [];
        outPoints.push(prevPoint);

        for (var i=1; i<len; i++) {
            point = points[i];
            if ( point.distanceSq(prevPoint) > sqTolerance ) {
                outPoints.push(new Vector2(point));
                prevPoint = point;
            }
        }
        if (prevPoint.x !== point.x || prevPoint.y !== point.y)
            outPoints.push(new Vector2(point));

        out.points = outPoints;
        return out; 
    }
});

module.exports = Shape;
},{"interpolation":10,"klasse":11,"vecmath/lib/Vector2":15}],10:[function(require,module,exports){
/** Utility function for linear interpolation. */
module.exports.lerp = function(v0, v1, t) {
    return v0*(1-t)+v1*t;
};

/** Utility function for Hermite interpolation. */
module.exports.smoothstep = function(v0, v1, t) {
    // Scale, bias and saturate x to 0..1 range
    t = Math.max(0.0, Math.min(1.0, (t - v0)/(v1 - v0) ));
    // Evaluate polynomial
    return t*t*(3 - 2*t);
};
},{}],11:[function(require,module,exports){
function hasGetterOrSetter(def) {
	return (!!def.get && typeof def.get === "function") || (!!def.set && typeof def.set === "function");
}

function getProperty(definition, k, isClassDescriptor) {
	//This may be a lightweight object, OR it might be a property
	//that was defined previously.
	
	//For simple class descriptors we can just assume its NOT previously defined.
	var def = isClassDescriptor 
				? definition[k] 
				: Object.getOwnPropertyDescriptor(definition, k);

	if (!isClassDescriptor && def.value && typeof def.value === "object") {
		def = def.value;
	}


	//This might be a regular property, or it may be a getter/setter the user defined in a class.
	if ( def && hasGetterOrSetter(def) ) {
		if (typeof def.enumerable === "undefined")
			def.enumerable = true;
		if (typeof def.configurable === "undefined")
			def.configurable = true;
		return def;
	} else {
		return false;
	}
}

function hasNonConfigurable(obj, k) {
	var prop = Object.getOwnPropertyDescriptor(obj, k);
	if (!prop)
		return false;

	if (prop.value && typeof prop.value === "object")
		prop = prop.value;

	if (prop.configurable === false) 
		return true;

	return false;
}

//TODO: On create, 
//		On mixin, 

function extend(ctor, definition, isClassDescriptor, extend) {
	for (var k in definition) {
		if (!definition.hasOwnProperty(k))
			continue;

		var def = getProperty(definition, k, isClassDescriptor);

		if (def !== false) {
			//If Extends is used, we will check its prototype to see if 
			//the final variable exists.
			
			var parent = extend || ctor;
			if (hasNonConfigurable(parent.prototype, k)) {

				//just skip the final property
				if (Class.ignoreFinals)
					continue;

				//We cannot re-define a property that is configurable=false.
				//So we will consider them final and throw an error. This is by
				//default so it is clear to the developer what is happening.
				//You can set ignoreFinals to true if you need to extend a class
				//which has configurable=false; it will simply not re-define final properties.
				throw new Error("cannot override final property '"+k
							+"', set Class.ignoreFinals = true to skip");
			}

			Object.defineProperty(ctor.prototype, k, def);
		} else {
			ctor.prototype[k] = definition[k];
		}

	}
}

/**
 */
function mixin(myClass, mixins) {
	if (!mixins)
		return;

	if (!Array.isArray(mixins))
		mixins = [mixins];

	for (var i=0; i<mixins.length; i++) {
		extend(myClass, mixins[i].prototype || mixins[i]);
	}
}

/**
 * Creates a new class with the given descriptor.
 * The constructor, defined by the name `initialize`,
 * is an optional function. If unspecified, an anonymous
 * function will be used which calls the parent class (if
 * one exists). 
 *
 * You can also use `Extends` and `Mixins` to provide subclassing
 * and inheritance.
 *
 * @class  Class
 * @constructor
 * @param {Object} definition a dictionary of functions for the class
 * @example
 *
 * 		var MyClass = new Class({
 * 		
 * 			initialize: function() {
 * 				this.foo = 2.0;
 * 			},
 *
 * 			bar: function() {
 * 				return this.foo + 5;
 * 			}
 * 		});
 */
function Class(definition) {
	if (!definition)
		definition = {};

	//The variable name here dictates what we see in Chrome debugger
	var initialize;
	var Extends;

	if (definition.initialize) {
		if (typeof definition.initialize !== "function")
			throw new Error("initialize must be a function");
		initialize = definition.initialize;

		//Usually we should avoid "delete" in V8 at all costs.
		//However, its unlikely to make any performance difference
		//here since we only call this on class creation (i.e. not object creation).
		delete definition.initialize;
	} else {
		if (definition.Extends) {
			var base = definition.Extends;
			initialize = function () {
				base.apply(this, arguments);
			}; 
		} else {
			initialize = function () {}; 
		}
	}

	if (definition.Extends) {
		initialize.prototype = Object.create(definition.Extends.prototype);
		initialize.prototype.constructor = initialize;
		//for getOwnPropertyDescriptor to work, we need to act
		//directly on the Extends (or Mixin)
		Extends = definition.Extends;
		delete definition.Extends;
	} else {
		initialize.prototype.constructor = initialize;
	}

	//Grab the mixins, if they are specified...
	var mixins = null;
	if (definition.Mixins) {
		mixins = definition.Mixins;
		delete definition.Mixins;
	}

	//First, mixin if we can.
	mixin(initialize, mixins);

	//Now we grab the actual definition which defines the overrides.
	extend(initialize, definition, true, Extends);

	return initialize;
};

Class.extend = extend;
Class.mixin = mixin;
Class.ignoreFinals = false;

module.exports = Class;
},{}],12:[function(require,module,exports){
var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array;

function Matrix3(m) {
    this.val = new ARRAY_TYPE(9);

    if (m) { //assume Matrix3 with val
        this.copy(m);
    } else { //default to identity
        this.idt();
    }
}

var mat3 = Matrix3.prototype;

mat3.clone = function() {
    return new Matrix3(this);
};

mat3.set = function(otherMat) {
    return this.copy(otherMat);
};

mat3.copy = function(otherMat) {
    var out = this.val,
        a = otherMat.val; 
    out[0] = a[0];
    out[1] = a[1];
    out[2] = a[2];
    out[3] = a[3];
    out[4] = a[4];
    out[5] = a[5];
    out[6] = a[6];
    out[7] = a[7];
    out[8] = a[8];
    return this;
};

mat3.fromMat4 = function(m) {
    var a = m.val,
        out = this.val;
    out[0] = a[0];
    out[1] = a[1];
    out[2] = a[2];
    out[3] = a[4];
    out[4] = a[5];
    out[5] = a[6];
    out[6] = a[8];
    out[7] = a[9];
    out[8] = a[10];
    return this;
};

mat3.fromArray = function(a) {
    var out = this.val;
    out[0] = a[0];
    out[1] = a[1];
    out[2] = a[2];
    out[3] = a[3];
    out[4] = a[4];
    out[5] = a[5];
    out[6] = a[6];
    out[7] = a[7];
    out[8] = a[8];
    return this;
};

mat3.identity = function() {
    var out = this.val;
    out[0] = 1;
    out[1] = 0;
    out[2] = 0;
    out[3] = 0;
    out[4] = 1;
    out[5] = 0;
    out[6] = 0;
    out[7] = 0;
    out[8] = 1;
    return this;
};

mat3.transpose = function() {
    var a = this.val,
        a01 = a[1], 
        a02 = a[2], 
        a12 = a[5];
    a[1] = a[3];
    a[2] = a[6];
    a[3] = a01;
    a[5] = a[7];
    a[6] = a02;
    a[7] = a12;
    return this;
};

mat3.invert = function() {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2],
        a10 = a[3], a11 = a[4], a12 = a[5],
        a20 = a[6], a21 = a[7], a22 = a[8],

        b01 = a22 * a11 - a12 * a21,
        b11 = -a22 * a10 + a12 * a20,
        b21 = a21 * a10 - a11 * a20,

        // Calculate the determinant
        det = a00 * b01 + a01 * b11 + a02 * b21;

    if (!det) { 
        return null; 
    }
    det = 1.0 / det;

    a[0] = b01 * det;
    a[1] = (-a22 * a01 + a02 * a21) * det;
    a[2] = (a12 * a01 - a02 * a11) * det;
    a[3] = b11 * det;
    a[4] = (a22 * a00 - a02 * a20) * det;
    a[5] = (-a12 * a00 + a02 * a10) * det;
    a[6] = b21 * det;
    a[7] = (-a21 * a00 + a01 * a20) * det;
    a[8] = (a11 * a00 - a01 * a10) * det;
    return this;
};

mat3.adjoint = function() {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2],
        a10 = a[3], a11 = a[4], a12 = a[5],
        a20 = a[6], a21 = a[7], a22 = a[8];

    a[0] = (a11 * a22 - a12 * a21);
    a[1] = (a02 * a21 - a01 * a22);
    a[2] = (a01 * a12 - a02 * a11);
    a[3] = (a12 * a20 - a10 * a22);
    a[4] = (a00 * a22 - a02 * a20);
    a[5] = (a02 * a10 - a00 * a12);
    a[6] = (a10 * a21 - a11 * a20);
    a[7] = (a01 * a20 - a00 * a21);
    a[8] = (a00 * a11 - a01 * a10);
    return this;
};

mat3.determinant = function() {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2],
        a10 = a[3], a11 = a[4], a12 = a[5],
        a20 = a[6], a21 = a[7], a22 = a[8];

    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
};

mat3.multiply = function(otherMat) {
    var a = this.val,
        b = otherMat.val,
        a00 = a[0], a01 = a[1], a02 = a[2],
        a10 = a[3], a11 = a[4], a12 = a[5],
        a20 = a[6], a21 = a[7], a22 = a[8],

        b00 = b[0], b01 = b[1], b02 = b[2],
        b10 = b[3], b11 = b[4], b12 = b[5],
        b20 = b[6], b21 = b[7], b22 = b[8];

    a[0] = b00 * a00 + b01 * a10 + b02 * a20;
    a[1] = b00 * a01 + b01 * a11 + b02 * a21;
    a[2] = b00 * a02 + b01 * a12 + b02 * a22;

    a[3] = b10 * a00 + b11 * a10 + b12 * a20;
    a[4] = b10 * a01 + b11 * a11 + b12 * a21;
    a[5] = b10 * a02 + b11 * a12 + b12 * a22;

    a[6] = b20 * a00 + b21 * a10 + b22 * a20;
    a[7] = b20 * a01 + b21 * a11 + b22 * a21;
    a[8] = b20 * a02 + b21 * a12 + b22 * a22;
    return this;
};

mat3.translate = function(v) {
    var a = this.val,
        x = v.x, y = v.y;
    a[6] = x * a[0] + y * a[3] + a[6];
    a[7] = x * a[1] + y * a[4] + a[7];
    a[8] = x * a[2] + y * a[5] + a[8];
    return this;
};

mat3.rotate = function(rad) {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2],
        a10 = a[3], a11 = a[4], a12 = a[5],

        s = Math.sin(rad),
        c = Math.cos(rad);

    a[0] = c * a00 + s * a10;
    a[1] = c * a01 + s * a11;
    a[2] = c * a02 + s * a12;

    a[3] = c * a10 - s * a00;
    a[4] = c * a11 - s * a01;
    a[5] = c * a12 - s * a02;
    return this;
};

mat3.scale = function(v) {
    var a = this.val,
        x = v.x, 
        y = v.y;

    a[0] = x * a[0];
    a[1] = x * a[1];
    a[2] = x * a[2];

    a[3] = y * a[3];
    a[4] = y * a[4];
    a[5] = y * a[5];
    return this;
};

mat3.fromQuat = function(q) {
    var x = q.x, y = q.y, z = q.z, w = q.w,
        x2 = x + x,
        y2 = y + y,
        z2 = z + z,

        xx = x * x2,
        xy = x * y2,
        xz = x * z2,
        yy = y * y2,
        yz = y * z2,
        zz = z * z2,
        wx = w * x2,
        wy = w * y2,
        wz = w * z2,

        out = this.val;

    out[0] = 1 - (yy + zz);
    out[3] = xy + wz;
    out[6] = xz - wy;

    out[1] = xy - wz;
    out[4] = 1 - (xx + zz);
    out[7] = yz + wx;

    out[2] = xz + wy;
    out[5] = yz - wx;
    out[8] = 1 - (xx + yy);
    return this;
};

mat3.normalFromMat4 = function(m) {
    var a = m.val,
        out = this.val,

        a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],

        b00 = a00 * a11 - a01 * a10,
        b01 = a00 * a12 - a02 * a10,
        b02 = a00 * a13 - a03 * a10,
        b03 = a01 * a12 - a02 * a11,
        b04 = a01 * a13 - a03 * a11,
        b05 = a02 * a13 - a03 * a12,
        b06 = a20 * a31 - a21 * a30,
        b07 = a20 * a32 - a22 * a30,
        b08 = a20 * a33 - a23 * a30,
        b09 = a21 * a32 - a22 * a31,
        b10 = a21 * a33 - a23 * a31,
        b11 = a22 * a33 - a23 * a32,

        // Calculate the determinant
        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;

    if (!det) { 
        return null; 
    }
    det = 1.0 / det;

    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;

    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;

    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
    return this;
};

mat3.mul = mat3.multiply;

mat3.idt = mat3.identity;

//This is handy for Pool utilities, to "reset" a
//shared object to its default state
mat3.reset = mat3.idt;

mat3.toString = function() {
    var a = this.val;
    return 'Matrix3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + 
                    a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + 
                    a[6] + ', ' + a[7] + ', ' + a[8] + ')';
};

mat3.str = mat3.toString;

module.exports = Matrix3;
},{}],13:[function(require,module,exports){
var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array;
var EPSILON = 0.000001;

function Matrix4(m) {
    this.val = new ARRAY_TYPE(16);

    if (m) { //assume Matrix4 with val
        this.copy(m);
    } else { //default to identity
        this.idt();
    }
}

var mat4 = Matrix4.prototype;

mat4.clone = function() {
    return new Matrix4(this);
};

mat4.set = function(otherMat) {
    return this.copy(otherMat);
};

mat4.copy = function(otherMat) {
    var out = this.val,
        a = otherMat.val; 
    out[0] = a[0];
    out[1] = a[1];
    out[2] = a[2];
    out[3] = a[3];
    out[4] = a[4];
    out[5] = a[5];
    out[6] = a[6];
    out[7] = a[7];
    out[8] = a[8];
    out[9] = a[9];
    out[10] = a[10];
    out[11] = a[11];
    out[12] = a[12];
    out[13] = a[13];
    out[14] = a[14];
    out[15] = a[15];
    return this;
};

mat4.fromArray = function(a) {
    var out = this.val;
    out[0] = a[0];
    out[1] = a[1];
    out[2] = a[2];
    out[3] = a[3];
    out[4] = a[4];
    out[5] = a[5];
    out[6] = a[6];
    out[7] = a[7];
    out[8] = a[8];
    out[9] = a[9];
    out[10] = a[10];
    out[11] = a[11];
    out[12] = a[12];
    out[13] = a[13];
    out[14] = a[14];
    out[15] = a[15];
    return this;
};

mat4.identity = function() {
    var out = this.val;
    out[0] = 1;
    out[1] = 0;
    out[2] = 0;
    out[3] = 0;
    out[4] = 0;
    out[5] = 1;
    out[6] = 0;
    out[7] = 0;
    out[8] = 0;
    out[9] = 0;
    out[10] = 1;
    out[11] = 0;
    out[12] = 0;
    out[13] = 0;
    out[14] = 0;
    out[15] = 1;
    return this;
};

mat4.transpose = function() {
    var a = this.val,
        a01 = a[1], a02 = a[2], a03 = a[3],
        a12 = a[6], a13 = a[7],
        a23 = a[11];

    a[1] = a[4];
    a[2] = a[8];
    a[3] = a[12];
    a[4] = a01;
    a[6] = a[9];
    a[7] = a[13];
    a[8] = a02;
    a[9] = a12;
    a[11] = a[14];
    a[12] = a03;
    a[13] = a13;
    a[14] = a23;
    return this;
};

mat4.invert = function() {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],

        b00 = a00 * a11 - a01 * a10,
        b01 = a00 * a12 - a02 * a10,
        b02 = a00 * a13 - a03 * a10,
        b03 = a01 * a12 - a02 * a11,
        b04 = a01 * a13 - a03 * a11,
        b05 = a02 * a13 - a03 * a12,
        b06 = a20 * a31 - a21 * a30,
        b07 = a20 * a32 - a22 * a30,
        b08 = a20 * a33 - a23 * a30,
        b09 = a21 * a32 - a22 * a31,
        b10 = a21 * a33 - a23 * a31,
        b11 = a22 * a33 - a23 * a32,

        // Calculate the determinant
        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;

    if (!det) { 
        return null; 
    }
    det = 1.0 / det;

    a[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
    a[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
    a[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
    a[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
    a[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
    a[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
    a[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
    a[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
    a[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
    a[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
    a[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
    a[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
    a[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
    a[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
    a[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
    a[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
    return this;
};

mat4.adjoint = function() {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];

    a[0]  =  (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));
    a[1]  = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
    a[2]  =  (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));
    a[3]  = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
    a[4]  = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
    a[5]  =  (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));
    a[6]  = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
    a[7]  =  (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));
    a[8]  =  (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));
    a[9]  = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
    a[10] =  (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));
    a[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
    a[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
    a[13] =  (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));
    a[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
    a[15] =  (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));
    return this;
};

mat4.determinant = function () {
    var a = this.val,
        a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],

        b00 = a00 * a11 - a01 * a10,
        b01 = a00 * a12 - a02 * a10,
        b02 = a00 * a13 - a03 * a10,
        b03 = a01 * a12 - a02 * a11,
        b04 = a01 * a13 - a03 * a11,
        b05 = a02 * a13 - a03 * a12,
        b06 = a20 * a31 - a21 * a30,
        b07 = a20 * a32 - a22 * a30,
        b08 = a20 * a33 - a23 * a30,
        b09 = a21 * a32 - a22 * a31,
        b10 = a21 * a33 - a23 * a31,
        b11 = a22 * a33 - a23 * a32;

    // Calculate the determinant
    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
};

mat4.multiply = function(otherMat) {
    var a = this.val,
        b = otherMat.val,
        a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];

    // Cache only the current line of the second matrix
    var b0  = b[0], b1 = b[1], b2 = b[2], b3 = b[3];  
    a[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
    a[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
    a[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
    a[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;

    b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];
    a[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
    a[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
    a[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
    a[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;

    b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];
    a[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
    a[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
    a[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
    a[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;

    b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];
    a[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
    a[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
    a[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
    a[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
    return this;
};

mat4.translate = function(v) {
    var x = v.x, y = v.y, z = v.z,
        a = this.val;
    a[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
    a[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
    a[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
    a[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
    return this;
};

mat4.scale = function(v) {
    var x = v.x, y = v.y, z = v.z, a = this.val;

    a[0] = a[0] * x;
    a[1] = a[1] * x;
    a[2] = a[2] * x;
    a[3] = a[3] * x;
    a[4] = a[4] * y;
    a[5] = a[5] * y;
    a[6] = a[6] * y;
    a[7] = a[7] * y;
    a[8] = a[8] * z;
    a[9] = a[9] * z;
    a[10] = a[10] * z;
    a[11] = a[11] * z;
    a[12] = a[12];
    a[13] = a[13];
    a[14] = a[14];
    a[15] = a[15];
    return this;
};

mat4.rotate = function (rad, axis) {
    var a = this.val,
        x = axis.x, y = axis.y, z = axis.z,
        len = Math.sqrt(x * x + y * y + z * z),
        s, c, t,
        a00, a01, a02, a03,
        a10, a11, a12, a13,
        a20, a21, a22, a23,
        b00, b01, b02,
        b10, b11, b12,
        b20, b21, b22;

    if (Math.abs(len) < EPSILON) { return null; }
    
    len = 1 / len;
    x *= len;
    y *= len;
    z *= len;

    s = Math.sin(rad);
    c = Math.cos(rad);
    t = 1 - c;

    a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];
    a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];
    a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];

    // Construct the elements of the rotation matrix
    b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;
    b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;
    b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;

    // Perform rotation-specific matrix multiplication
    a[0] = a00 * b00 + a10 * b01 + a20 * b02;
    a[1] = a01 * b00 + a11 * b01 + a21 * b02;
    a[2] = a02 * b00 + a12 * b01 + a22 * b02;
    a[3] = a03 * b00 + a13 * b01 + a23 * b02;
    a[4] = a00 * b10 + a10 * b11 + a20 * b12;
    a[5] = a01 * b10 + a11 * b11 + a21 * b12;
    a[6] = a02 * b10 + a12 * b11 + a22 * b12;
    a[7] = a03 * b10 + a13 * b11 + a23 * b12;
    a[8] = a00 * b20 + a10 * b21 + a20 * b22;
    a[9] = a01 * b20 + a11 * b21 + a21 * b22;
    a[10] = a02 * b20 + a12 * b21 + a22 * b22;
    a[11] = a03 * b20 + a13 * b21 + a23 * b22;
    return this;
};

mat4.rotateX = function(rad) {
    var a = this.val,
        s = Math.sin(rad),
        c = Math.cos(rad),
        a10 = a[4],
        a11 = a[5],
        a12 = a[6],
        a13 = a[7],
        a20 = a[8],
        a21 = a[9],
        a22 = a[10],
        a23 = a[11];

    // Perform axis-specific matrix multiplication
    a[4] = a10 * c + a20 * s;
    a[5] = a11 * c + a21 * s;
    a[6] = a12 * c + a22 * s;
    a[7] = a13 * c + a23 * s;
    a[8] = a20 * c - a10 * s;
    a[9] = a21 * c - a11 * s;
    a[10] = a22 * c - a12 * s;
    a[11] = a23 * c - a13 * s;
    return this;
};

mat4.rotateY = function(rad) {
    var a = this.val,
        s = Math.sin(rad),
        c = Math.cos(rad),
        a00 = a[0],
        a01 = a[1],
        a02 = a[2],
        a03 = a[3],
        a20 = a[8],
        a21 = a[9],
        a22 = a[10],
        a23 = a[11];

    // Perform axis-specific matrix multiplication
    a[0] = a00 * c - a20 * s;
    a[1] = a01 * c - a21 * s;
    a[2] = a02 * c - a22 * s;
    a[3] = a03 * c - a23 * s;
    a[8] = a00 * s + a20 * c;
    a[9] = a01 * s + a21 * c;
    a[10] = a02 * s + a22 * c;
    a[11] = a03 * s + a23 * c;
    return this;
};

mat4.rotateZ = function (rad) {
    var a = this.val,
        s = Math.sin(rad),
        c = Math.cos(rad),
        a00 = a[0],
        a01 = a[1],
        a02 = a[2],
        a03 = a[3],
        a10 = a[4],
        a11 = a[5],
        a12 = a[6],
        a13 = a[7];

    // Perform axis-specific matrix multiplication
    a[0] = a00 * c + a10 * s;
    a[1] = a01 * c + a11 * s;
    a[2] = a02 * c + a12 * s;
    a[3] = a03 * c + a13 * s;
    a[4] = a10 * c - a00 * s;
    a[5] = a11 * c - a01 * s;
    a[6] = a12 * c - a02 * s;
    a[7] = a13 * c - a03 * s;
    return this;
};

mat4.fromRotationTranslation = function (q, v) {
    // Quaternion math
    var out = this.val,
        x = q.x, y = q.y, z = q.z, w = q.w,
        x2 = x + x,
        y2 = y + y,
        z2 = z + z,

        xx = x * x2,
        xy = x * y2,
        xz = x * z2,
        yy = y * y2,
        yz = y * z2,
        zz = z * z2,
        wx = w * x2,
        wy = w * y2,
        wz = w * z2;

    out[0] = 1 - (yy + zz);
    out[1] = xy + wz;
    out[2] = xz - wy;
    out[3] = 0;
    out[4] = xy - wz;
    out[5] = 1 - (xx + zz);
    out[6] = yz + wx;
    out[7] = 0;
    out[8] = xz + wy;
    out[9] = yz - wx;
    out[10] = 1 - (xx + yy);
    out[11] = 0;
    out[12] = v.x;
    out[13] = v.y;
    out[14] = v.z;
    out[15] = 1;
    return this;
};

mat4.fromQuat = function (q) {
    var out = this.val,
        x = q.x, y = q.y, z = q.z, w = q.w,
        x2 = x + x,
        y2 = y + y,
        z2 = z + z,

        xx = x * x2,
        xy = x * y2,
        xz = x * z2,
        yy = y * y2,
        yz = y * z2,
        zz = z * z2,
        wx = w * x2,
        wy = w * y2,
        wz = w * z2;

    out[0] = 1 - (yy + zz);
    out[1] = xy + wz;
    out[2] = xz - wy;
    out[3] = 0;

    out[4] = xy - wz;
    out[5] = 1 - (xx + zz);
    out[6] = yz + wx;
    out[7] = 0;

    out[8] = xz + wy;
    out[9] = yz - wx;
    out[10] = 1 - (xx + yy);
    out[11] = 0;

    out[12] = 0;
    out[13] = 0;
    out[14] = 0;
    out[15] = 1;

    return this;
};


/**
 * Generates a frustum matrix with the given bounds
 *
 * @param {Number} left Left bound of the frustum
 * @param {Number} right Right bound of the frustum
 * @param {Number} bottom Bottom bound of the frustum
 * @param {Number} top Top bound of the frustum
 * @param {Number} near Near bound of the frustum
 * @param {Number} far Far bound of the frustum
 * @returns {Matrix4} this for chaining
 */
mat4.frustum = function (left, right, bottom, top, near, far) {
    var out = this.val,
        rl = 1 / (right - left),
        tb = 1 / (top - bottom),
        nf = 1 / (near - far);
    out[0] = (near * 2) * rl;
    out[1] = 0;
    out[2] = 0;
    out[3] = 0;
    out[4] = 0;
    out[5] = (near * 2) * tb;
    out[6] = 0;
    out[7] = 0;
    out[8] = (right + left) * rl;
    out[9] = (top + bottom) * tb;
    out[10] = (far + near) * nf;
    out[11] = -1;
    out[12] = 0;
    out[13] = 0;
    out[14] = (far * near * 2) * nf;
    out[15] = 0;
    return this;
};


/**
 * Generates a perspective projection matrix with the given bounds
 *
 * @param {number} fovy Vertical field of view in radians
 * @param {number} aspect Aspect ratio. typically viewport width/height
 * @param {number} near Near bound of the frustum
 * @param {number} far Far bound of the frustum
 * @returns {Matrix4} this for chaining
 */
mat4.perspective = function (fovy, aspect, near, far) {
    var out = this.val,
        f = 1.0 / Math.tan(fovy / 2),
        nf = 1 / (near - far);
    out[0] = f / aspect;
    out[1] = 0;
    out[2] = 0;
    out[3] = 0;
    out[4] = 0;
    out[5] = f;
    out[6] = 0;
    out[7] = 0;
    out[8] = 0;
    out[9] = 0;
    out[10] = (far + near) * nf;
    out[11] = -1;
    out[12] = 0;
    out[13] = 0;
    out[14] = (2 * far * near) * nf;
    out[15] = 0;
    return this;
};

/**
 * Generates a orthogonal projection matrix with the given bounds
 *
 * @param {number} left Left bound of the frustum
 * @param {number} right Right bound of the frustum
 * @param {number} bottom Bottom bound of the frustum
 * @param {number} top Top bound of the frustum
 * @param {number} near Near bound of the frustum
 * @param {number} far Far bound of the frustum
 * @returns {Matrix4} this for chaining
 */
mat4.ortho = function (left, right, bottom, top, near, far) {
    var out = this.val,
        lr = left-right,
        bt = bottom-top,
        nf = near-far;

    //avoid division by zero
    lr = lr===0 ? lr : 1/lr;
    bt = bt===0 ? bt : 1/bt;
    nf = nf===0 ? nf : 1/nf;

    out[0] = -2 * lr;
    out[1] = 0;
    out[2] = 0;
    out[3] = 0;
    out[4] = 0;
    out[5] = -2 * bt;
    out[6] = 0;
    out[7] = 0;
    out[8] = 0;
    out[9] = 0;
    out[10] = 2 * nf;
    out[11] = 0;
    out[12] = (left + right) * lr;
    out[13] = (top + bottom) * bt;
    out[14] = (far + near) * nf;
    out[15] = 1;
    return this;
};

/**
 * Generates a look-at matrix with the given eye position, focal point, and up axis
 *
 * @param {Vector3} eye Position of the viewer
 * @param {Vector3} center Point the viewer is looking at
 * @param {Vector3} up vec3 pointing up
 * @returns {Matrix4} this for chaining
 */
mat4.lookAt = function (eye, center, up) {
    var out = this.val,

        x0, x1, x2, y0, y1, y2, z0, z1, z2, len,
        eyex = eye.x,
        eyey = eye.y,
        eyez = eye.z,
        upx = up.x,
        upy = up.y,
        upz = up.z,
        centerx = center.x,
        centery = center.y,
        centerz = center.z;

    if (Math.abs(eyex - centerx) < EPSILON &&
        Math.abs(eyey - centery) < EPSILON &&
        Math.abs(eyez - centerz) < EPSILON) {
        return this.identity();
    }

    z0 = eyex - centerx;
    z1 = eyey - centery;
    z2 = eyez - centerz;

    len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
    z0 *= len;
    z1 *= len;
    z2 *= len;

    x0 = upy * z2 - upz * z1;
    x1 = upz * z0 - upx * z2;
    x2 = upx * z1 - upy * z0;
    len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
    if (!len) {
        x0 = 0;
        x1 = 0;
        x2 = 0;
    } else {
        len = 1 / len;
        x0 *= len;
        x1 *= len;
        x2 *= len;
    }

    y0 = z1 * x2 - z2 * x1;
    y1 = z2 * x0 - z0 * x2;
    y2 = z0 * x1 - z1 * x0;

    len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
    if (!len) {
        y0 = 0;
        y1 = 0;
        y2 = 0;
    } else {
        len = 1 / len;
        y0 *= len;
        y1 *= len;
        y2 *= len;
    }

    out[0] = x0;
    out[1] = y0;
    out[2] = z0;
    out[3] = 0;
    out[4] = x1;
    out[5] = y1;
    out[6] = z1;
    out[7] = 0;
    out[8] = x2;
    out[9] = y2;
    out[10] = z2;
    out[11] = 0;
    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
    out[15] = 1;

    return this;
};


mat4.mul = mat4.multiply;

mat4.idt = mat4.identity;

//This is handy for Pool utilities, to "reset" a
//shared object to its default state
mat4.reset = mat4.idt;

mat4.toString = function () {
    var a = this.val;
    return 'Matrix4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +
                    a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +
                    a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + 
                    a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';
};

mat4.str = mat4.toString;

module.exports = Matrix4;

},{}],14:[function(require,module,exports){
var Vector3 = require('./Vector3');
var Matrix3 = require('./Matrix3');
var common = require('./common');

//some shared 'private' arrays
var s_iNext = (typeof Int8Array !== 'undefined' ? new Int8Array([1,2,0]) : [1,2,0]);
var tmp = (typeof Float32Array !== 'undefined' ? new Float32Array([0,0,0]) : [0,0,0]);

var xUnitVec3 = new Vector3(1, 0, 0);
var yUnitVec3 = new Vector3(0, 1, 0);
var tmpvec = new Vector3();

var tmpMat3 = new Matrix3();

function Quaternion(x, y, z, w) {
	if (typeof x === "object") {
        this.x = x.x||0;
        this.y = x.y||0;
        this.z = x.z||0;
        this.w = x.w||0;
    } else {
        this.x = x||0;
        this.y = y||0;
        this.z = z||0;
        this.w = w||0;
    }
}

var quat = Quaternion.prototype;

//mixin common functions
for (var k in common) {
    quat[k] = common[k];
}

quat.rotationTo = function(a, b) {
    var dot = a.x * b.x + a.y * b.y + a.z * b.z; //a.dot(b)
    if (dot < -0.999999) {
        if (tmpvec.copy(xUnitVec3).cross(a).len() < 0.000001)
            tmpvec.copy(yUnitVec3).cross(a);
        
        tmpvec.normalize();
        return this.setAxisAngle(tmpvec, Math.PI);
    } else if (dot > 0.999999) {
        this.x = 0;
        this.y = 0;
        this.z = 0;
        this.w = 1;
        return this;
    } else {
        tmpvec.copy(a).cross(b);
        this.x = tmpvec.x;
        this.y = tmpvec.y;
        this.z = tmpvec.z;
        this.w = 1 + dot;
        return this.normalize();
    }
};

quat.setAxes = function(view, right, up) {
    var m = tmpMat3.val;
    m[0] = right.x;
    m[3] = right.y;
    m[6] = right.z;

    m[1] = up.x;
    m[4] = up.y;
    m[7] = up.z;

    m[2] = -view.x;
    m[5] = -view.y;
    m[8] = -view.z;

    return this.fromMat3(tmpMat3).normalize();
};

quat.identity = function() {
    this.x = this.y = this.z = 0;
    this.w = 1;
    return this;
};

quat.setAxisAngle = function(axis, rad) {
    rad = rad * 0.5;
    var s = Math.sin(rad);
    this.x = s * axis.x;
    this.y = s * axis.y;
    this.z = s * axis.z;
    this.w = Math.cos(rad);
    return this;
};

quat.multiply = function(b) {
    var ax = this.x, ay = this.y, az = this.z, aw = this.w,
        bx = b.x, by = b.y, bz = b.z, bw = b.w;

    this.x = ax * bw + aw * bx + ay * bz - az * by;
    this.y = ay * bw + aw * by + az * bx - ax * bz;
    this.z = az * bw + aw * bz + ax * by - ay * bx;
    this.w = aw * bw - ax * bx - ay * by - az * bz;
    return this;
};

quat.slerp = function (b, t) {
    // benchmarks:
    //    http://jsperf.com/quaternion-slerp-implementations

    var ax = this.x, ay = this.y, az = this.y, aw = this.y,
        bx = b.x, by = b.y, bz = b.z, bw = b.w;

    var        omega, cosom, sinom, scale0, scale1;

    // calc cosine
    cosom = ax * bx + ay * by + az * bz + aw * bw;
    // adjust signs (if necessary)
    if ( cosom < 0.0 ) {
        cosom = -cosom;
        bx = - bx;
        by = - by;
        bz = - bz;
        bw = - bw;
    }
    // calculate coefficients
    if ( (1.0 - cosom) > 0.000001 ) {
        // standard case (slerp)
        omega  = Math.acos(cosom);
        sinom  = Math.sin(omega);
        scale0 = Math.sin((1.0 - t) * omega) / sinom;
        scale1 = Math.sin(t * omega) / sinom;
    } else {        
        // "from" and "to" quaternions are very close 
        //  ... so we can do a linear interpolation
        scale0 = 1.0 - t;
        scale1 = t;
    }
    // calculate final values
    this.x = scale0 * ax + scale1 * bx;
    this.y = scale0 * ay + scale1 * by;
    this.z = scale0 * az + scale1 * bz;
    this.w = scale0 * aw + scale1 * bw;
    return this;
};

quat.invert = function() {
    var a0 = this.x, a1 = this.y, a2 = this.z, a3 = this.w,
        dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,
        invDot = dot ? 1.0/dot : 0;
    
    // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0

    this.x = -a0*invDot;
    this.y = -a1*invDot;
    this.z = -a2*invDot;
    this.w = a3*invDot;
    return this;
};

quat.conjugate = function() {
    this.x = -this.x;
    this.y = -this.y;
    this.z = -this.z;
    return this;
};

quat.rotateX = function (rad) {
    rad *= 0.5; 

    var ax = this.x, ay = this.y, az = this.z, aw = this.w,
        bx = Math.sin(rad), bw = Math.cos(rad);

    this.x = ax * bw + aw * bx;
    this.y = ay * bw + az * bx;
    this.z = az * bw - ay * bx;
    this.w = aw * bw - ax * bx;
    return this;
};

quat.rotateY = function (rad) {
    rad *= 0.5; 

    var ax = this.x, ay = this.y, az = this.z, aw = this.w,
        by = Math.sin(rad), bw = Math.cos(rad);

    this.x = ax * bw - az * by;
    this.y = ay * bw + aw * by;
    this.z = az * bw + ax * by;
    this.w = aw * bw - ay * by;
    return this;
};

quat.rotateZ = function (rad) {
    rad *= 0.5; 

    var ax = this.x, ay = this.y, az = this.z, aw = this.w,
        bz = Math.sin(rad), bw = Math.cos(rad);

    this.x = ax * bw + ay * bz;
    this.y = ay * bw - ax * bz;
    this.z = az * bw + aw * bz;
    this.w = aw * bw - az * bz;
    return this;
};

quat.calculateW = function () {
    var x = this.x, y = this.y, z = this.z;

    this.x = x;
    this.y = y;
    this.z = z;
    this.w = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
    return this;
};

quat.fromMat3 = function(mat) {
    // benchmarks:
    //    http://jsperf.com/typed-array-access-speed
    //    http://jsperf.com/conversion-of-3x3-matrix-to-quaternion

    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
    // article "Quaternion Calculus and Fast Animation".
    var m = mat.val,
        fTrace = m[0] + m[4] + m[8];
    var fRoot;

    if ( fTrace > 0.0 ) {
        // |w| > 1/2, may as well choose w > 1/2
        fRoot = Math.sqrt(fTrace + 1.0);  // 2w
        this.w = 0.5 * fRoot;
        fRoot = 0.5/fRoot;  // 1/(4w)
        this.x = (m[7]-m[5])*fRoot;
        this.y = (m[2]-m[6])*fRoot;
        this.z = (m[3]-m[1])*fRoot;
    } else {
        // |w| <= 1/2
        var i = 0;
        if ( m[4] > m[0] )
          i = 1;
        if ( m[8] > m[i*3+i] )
          i = 2;
        var j = s_iNext[i];
        var k = s_iNext[j];
            
        //This isn't quite as clean without array access...
        fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);
        tmp[i] = 0.5 * fRoot;

        fRoot = 0.5 / fRoot;
        tmp[j] = (m[j*3+i] + m[i*3+j]) * fRoot;
        tmp[k] = (m[k*3+i] + m[i*3+k]) * fRoot;

        this.x = tmp[0];
        this.y = tmp[1];
        this.z = tmp[2];
        this.w = (m[k*3+j] - m[j*3+k]) * fRoot;
    }
    
    return this;
};

quat.idt = quat.identity;

quat.sub = quat.subtract;

quat.mul = quat.multiply;

quat.len = quat.length;

quat.lenSq = quat.lengthSq;

//This is handy for Pool utilities, to "reset" a
//shared object to its default state
quat.reset = quat.idt;


quat.toString = function() {
    return 'Quaternion(' + this.x + ', ' + this.y + ', ' + this.z + ', ' + this.w + ')';
};

quat.str = quat.toString;

module.exports = Quaternion;
},{"./Matrix3":12,"./Vector3":16,"./common":18}],15:[function(require,module,exports){
function Vector2(x, y) {
	if (typeof x === "object") {
        this.x = x.x||0;
        this.y = x.y||0;
    } else {
        this.x = x||0;
        this.y = y||0;
    }
}

//shorthand it for better minification
var vec2 = Vector2.prototype;

/**
 * Returns a new instance of Vector2 with
 * this vector's components. 
 * @return {Vector2} a clone of this vector
 */
vec2.clone = function() {
    return new Vector2(this.x, this.y);
};

/**
 * Copies the x, y components from the specified
 * Vector. Any undefined components from `otherVec`
 * will default to zero.
 * 
 * @param  {otherVec} the other Vector2 to copy
 * @return {Vector2}  this, for chaining
 */
vec2.copy = function(otherVec) {
    this.x = otherVec.x||0;
    this.y = otherVec.y||0;
    return this;
};

/**
 * A convenience function to set the components of
 * this vector as x and y. Falsy or undefined
 * parameters will default to zero.
 *
 * You can also pass a vector object instead of
 * individual components, to copy the object's components.
 * 
 * @param {Number} x the x component
 * @param {Number} y the y component
 * @return {Vector2}  this, for chaining
 */
vec2.set = function(x, y) {
    if (typeof x === "object") {
        this.x = x.x||0;
        this.y = x.y||0;
    } else {
        this.x = x||0;
        this.y = y||0;
    }
    return this;
};

vec2.add = function(v) {
    this.x += v.x;
    this.y += v.y;
    return this;
};

vec2.subtract = function(v) {
    this.x -= v.x;
    this.y -= v.y;
    return this;
};

vec2.multiply = function(v) {
    this.x *= v.x;
    this.y *= v.y;
    return this;
};

vec2.scale = function(s) {
    this.x *= s;
    this.y *= s;
    return this;
};

vec2.divide = function(v) {
    this.x /= v.x;
    this.y /= v.y;
    return this;
};

vec2.negate = function() {
    this.x = -this.x;
    this.y = -this.y;
    return this;
};

vec2.distance = function(v) {
    var dx = v.x - this.x,
        dy = v.y - this.y;
    return Math.sqrt(dx*dx + dy*dy);
};

vec2.distanceSq = function(v) {
    var dx = v.x - this.x,
        dy = v.y - this.y;
    return dx*dx + dy*dy;
};

vec2.length = function() {
    var x = this.x,
        y = this.y;
    return Math.sqrt(x*x + y*y);
};

vec2.lengthSq = function() {
    var x = this.x,
        y = this.y;
    return x*x + y*y;
};

vec2.normalize = function() {
    var x = this.x,
        y = this.y;
    var len = x*x + y*y;
    if (len > 0) {
        len = 1 / Math.sqrt(len);
        this.x = x*len;
        this.y = y*len;
    }
    return this;
};

vec2.dot = function(v) {
    return this.x * v.x + this.y * v.y;
};

//Unlike Vector3, this returns a scalar
//http://allenchou.net/2013/07/cross-product-of-2d-vectors/
vec2.cross = function(v) {
    return this.x * v.y - this.y * v.x;
};

vec2.lerp = function(v, t) {
    var ax = this.x,
        ay = this.y;
    t = t||0;
    this.x = ax + t * (v.x - ax);
    this.y = ay + t * (v.y - ay);
    return this;
};

vec2.transformMat3 = function(mat) {
    var x = this.x, y = this.y, m = mat.val;
    this.x = m[0] * x + m[3] * y + m[6];
    this.y = m[1] * x + m[4] * y + m[7];
    return this;
};

vec2.transformMat4 = function(mat) {
    var x = this.x, 
        y = this.y,
        m = mat.val;
    this.x = m[0] * x + m[4] * y + m[12];
    this.y = m[1] * x + m[5] * y + m[13];
    return this;
};

vec2.reset = function() {
    this.x = 0;
    this.y = 0;
    return this;
};

vec2.sub = vec2.subtract;

vec2.mul = vec2.multiply;

vec2.div = vec2.divide;

vec2.dist = vec2.distance;

vec2.distSq = vec2.distanceSq;

vec2.len = vec2.length;

vec2.lenSq = vec2.lengthSq;

vec2.toString = function() {
    return 'Vector2(' + this.x + ', ' + this.y + ')';
};

vec2.random = function(scale) {
    scale = scale || 1.0;
    var r = Math.random() * 2.0 * Math.PI;
    this.x = Math.cos(r) * scale;
    this.y = Math.sin(r) * scale;
    return this;
};

vec2.str = vec2.toString;

module.exports = Vector2;
},{}],16:[function(require,module,exports){
function Vector3(x, y, z) {
    if (typeof x === "object") {
        this.x = x.x||0;
        this.y = x.y||0;
        this.z = x.z||0;
    } else {
        this.x = x||0;
        this.y = y||0;
        this.z = z||0;
    }
}

//shorthand it for better minification
var vec3 = Vector3.prototype;

vec3.clone = function() {
    return new Vector3(this.x, this.y, this.z);
};

vec3.copy = function(otherVec) {
    this.x = otherVec.x;
    this.y = otherVec.y;
    this.z = otherVec.z;
    return this;
};

vec3.set = function(x, y, z) {
    if (typeof x === "object") {
        this.x = x.x||0;
        this.y = x.y||0;
        this.z = x.z||0;
    } else {
        this.x = x||0;
        this.y = y||0;
        this.z = z||0;
    }
    return this;
};

vec3.add = function(v) {
    this.x += v.x;
    this.y += v.y;
    this.z += v.z;
    return this;
};

vec3.subtract = function(v) {
    this.x -= v.x;
    this.y -= v.y;
    this.z -= v.z;
    return this;
};

vec3.multiply = function(v) {
    this.x *= v.x;
    this.y *= v.y;
    this.z *= v.z;
    return this;
};

vec3.scale = function(s) {
    this.x *= s;
    this.y *= s;
    this.z *= s;
    return this;
};

vec3.divide = function(v) {
    this.x /= v.x;
    this.y /= v.y;
    this.z /= v.z;
    return this;
};

vec3.negate = function() {
    this.x = -this.x;
    this.y = -this.y;
    this.z = -this.z;
    return this;
};

vec3.distance = function(v) {
    var dx = v.x - this.x,
        dy = v.y - this.y,
        dz = v.z - this.z;
    return Math.sqrt(dx*dx + dy*dy + dz*dz);
};

vec3.distanceSq = function(v) {
    var dx = v.x - this.x,
        dy = v.y - this.y,
        dz = v.z - this.z;
    return dx*dx + dy*dy + dz*dz;
};

vec3.length = function() {
    var x = this.x,
        y = this.y,
        z = this.z;
    return Math.sqrt(x*x + y*y + z*z);
};

vec3.lengthSq = function() {
    var x = this.x,
        y = this.y,
        z = this.z;
    return x*x + y*y + z*z;
};

vec3.normalize = function() {
    var x = this.x,
        y = this.y,
        z = this.z;
    var len = x*x + y*y + z*z;
    if (len > 0) {
        len = 1 / Math.sqrt(len);
        this.x = x*len;
        this.y = y*len;
        this.z = z*len;
    }
    return this;
};

vec3.dot = function(v) {
    return this.x * v.x + this.y * v.y + this.z * v.z;
};

vec3.cross = function(v) {
    var ax = this.x, ay = this.y, az = this.z,
        bx = v.x, by = v.y, bz = v.z;

    this.x = ay * bz - az * by;
    this.y = az * bx - ax * bz;
    this.z = ax * by - ay * bx;
    return this;
};

vec3.lerp = function(v, t) {
    var ax = this.x,
        ay = this.y,
        az = this.z;
    t = t||0;
    this.x = ax + t * (v.x - ax);
    this.y = ay + t * (v.y - ay);
    this.z = az + t * (v.z - az);
    return this;
};

vec3.transformMat4 = function(mat) {
    var x = this.x, y = this.y, z = this.z, m = mat.val;
    this.x = m[0] * x + m[4] * y + m[8] * z + m[12];
    this.y = m[1] * x + m[5] * y + m[9] * z + m[13];
    this.z = m[2] * x + m[6] * y + m[10] * z + m[14];
    return this;
};

vec3.transformMat3 = function(mat) {
    var x = this.x, y = this.y, z = this.z, m = mat.val;
    this.x = x * m[0] + y * m[3] + z * m[6];
    this.y = x * m[1] + y * m[4] + z * m[7];
    this.z = x * m[2] + y * m[5] + z * m[8];
    return this;
};

vec3.transformQuat = function(q) {
    // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations
    var x = this.x, y = this.y, z = this.z,
        qx = q.x, qy = q.y, qz = q.z, qw = q.w,

        // calculate quat * vec
        ix = qw * x + qy * z - qz * y,
        iy = qw * y + qz * x - qx * z,
        iz = qw * z + qx * y - qy * x,
        iw = -qx * x - qy * y - qz * z;

    // calculate result * inverse quat
    this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
    this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
    this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
    return this;
};

/**
 * Multiplies this Vector3 by the specified matrix, 
 * applying a W divide. This is useful for projection,
 * e.g. unprojecting a 2D point into 3D space.
 *
 * @method  prj
 * @param {Matrix4} the 4x4 matrix to multiply with 
 * @return {Vector3} this object for chaining
 */
vec3.project = function(mat) {
    var x = this.x,
        y = this.y,
        z = this.z,
        m = mat.val,
        a00 = m[0], a01 = m[1], a02 = m[2], a03 = m[3],
        a10 = m[4], a11 = m[5], a12 = m[6], a13 = m[7],
        a20 = m[8], a21 = m[9], a22 = m[10], a23 = m[11],
        a30 = m[12], a31 = m[13], a32 = m[14], a33 = m[15];

    var l_w = 1 / (x * a03 + y * a13 + z * a23 + a33);

    this.x = (x * a00 + y * a10 + z * a20 + a30) * l_w; 
    this.y = (x * a01 + y * a11 + z * a21 + a31) * l_w; 
    this.z = (x * a02 + y * a12 + z * a22 + a32) * l_w;
    return this;
};

/**
 * Unproject this point from 2D space to 3D space.
 * The point should have its x and y properties set to
 * 2D screen space, and the z either at 0 (near plane)
 * or 1 (far plane). The provided matrix is assumed to already
 * be combined, i.e. projection * view * model.
 *
 * After this operation, this vector's (x, y, z) components will
 * represent the unprojected 3D coordinate.
 * 
 * @param  {Vector4} viewport          screen x, y, width and height in pixels
 * @param  {Matrix4} invProjectionView combined projection and view matrix
 * @return {Vector3}                   this object, for chaining
 */
vec3.unproject = function(viewport, invProjectionView) {
    var viewX = viewport.x,
        viewY = viewport.y,
        viewWidth = viewport.z,
        viewHeight = viewport.w;
    
    var x = this.x, 
        y = this.y,
        z = this.z;

    x = x - viewX;
    y = viewHeight - y - 1;
    y = y - viewY;

    this.x = (2 * x) / viewWidth - 1;
    this.y = (2 * y) / viewHeight - 1;
    this.z = 2 * z - 1;

    return this.project(invProjectionView);
};

vec3.random = function(scale) {
    scale = scale || 1.0;

    var r = Math.random() * 2.0 * Math.PI;
    var z = (Math.random() * 2.0) - 1.0;
    var zScale = Math.sqrt(1.0-z*z) * scale;
    
    this.x = Math.cos(r) * zScale;
    this.y = Math.sin(r) * zScale;
    this.z = z * scale;
    return this;
};

vec3.reset = function() {
    this.x = 0;
    this.y = 0;
    this.z = 0;
    return this;
};


vec3.sub = vec3.subtract;

vec3.mul = vec3.multiply;

vec3.div = vec3.divide;

vec3.dist = vec3.distance;

vec3.distSq = vec3.distanceSq;

vec3.len = vec3.length;

vec3.lenSq = vec3.lengthSq;

vec3.toString = function() {
    return 'Vector3(' + this.x + ', ' + this.y + ', ' + this.z + ')';
};

vec3.str = vec3.toString;

module.exports = Vector3;
},{}],17:[function(require,module,exports){
var common = require('./common');

function Vector4(x, y, z, w) {
	if (typeof x === "object") {
        this.x = x.x||0;
        this.y = x.y||0;
        this.z = x.z||0;
        this.w = x.w||0;
    } else {
        this.x = x||0;
        this.y = y||0;
        this.z = z||0;
        this.w = w||0;
    }
}

//shorthand it for better minification
var vec4 = Vector4.prototype;

//mixin common functions
for (var k in common) {
    vec4[k] = common[k];
}

vec4.clone = function() {
    return new Vector4(this.x, this.y, this.z, this.w);
};

vec4.multiply = function(v) {
    this.x *= v.x;
    this.y *= v.y;
    this.z *= v.z;
    this.w *= v.w;
    return this;
};

vec4.divide = function(v) {
    this.x /= v.x;
    this.y /= v.y;
    this.z /= v.z;
    this.w /= v.w;
    return this;
};

vec4.distance = function(v) {
    var dx = v.x - this.x,
        dy = v.y - this.y,
        dz = v.z - this.z,
        dw = v.w - this.w;
    return Math.sqrt(dx*dx + dy*dy + dz*dz + dw*dw);
};

vec4.distanceSq = function(v) {
    var dx = v.x - this.x,
        dy = v.y - this.y,
        dz = v.z - this.z,
        dw = v.w - this.w;
    return dx*dx + dy*dy + dz*dz + dw*dw;
};

vec4.negate = function() {
    this.x = -this.x;
    this.y = -this.y;
    this.z = -this.z;
    this.w = -this.w;
    return this;
};

vec4.transformMat4 = function(mat) {
    var m = mat.val, x = this.x, y = this.y, z = this.z, w = this.w;
    this.x = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
    this.y = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
    this.z = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
    this.w = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
    return this;
};

//// TODO: is this really the same as Vector3 ??
///  Also, what about this:
///  http://molecularmusings.wordpress.com/2013/05/24/a-faster-quaternion-vector-multiplication/
vec4.transformQuat = function(q) {
    // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations
    var x = this.x, y = this.y, z = this.z,
        qx = q.x, qy = q.y, qz = q.z, qw = q.w,

        // calculate quat * vec
        ix = qw * x + qy * z - qz * y,
        iy = qw * y + qz * x - qx * z,
        iz = qw * z + qx * y - qy * x,
        iw = -qx * x - qy * y - qz * z;

    // calculate result * inverse quat
    this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
    this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
    this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
    return this;
};

vec4.random = function(scale) {
    scale = scale || 1.0;

    //Not spherical; should fix this for more uniform distribution
    this.x = (Math.random() * 2 - 1) * scale;
    this.y = (Math.random() * 2 - 1) * scale;
    this.z = (Math.random() * 2 - 1) * scale;
    this.w = (Math.random() * 2 - 1) * scale;
    return this;
};

vec4.reset = function() {
    this.x = 0;
    this.y = 0;
    this.z = 0;
    this.w = 0;
    return this;
};

vec4.sub = vec4.subtract;

vec4.mul = vec4.multiply;

vec4.div = vec4.divide;

vec4.dist = vec4.distance;

vec4.distSq = vec4.distanceSq;

vec4.len = vec4.length;

vec4.lenSq = vec4.lengthSq;

vec4.toString = function() {
    return 'Vector4(' + this.x + ', ' + this.y + ', ' + this.z + ', ' + this.w + ')';
};

vec4.str = vec4.toString;

module.exports = Vector4;
},{"./common":18}],18:[function(require,module,exports){
//common vec4 functions
module.exports = {
    
/**
 * Copies the x, y, z, w components from the specified
 * Vector. Unlike most other operations, this function
 * will default undefined components on `otherVec` to zero.
 * 
 * @method  copy
 * @param  {otherVec} the other Vector4 to copy
 * @return {Vector}  this, for chaining
 */


/**
 * A convenience function to set the components of
 * this vector as x, y, z, w. Falsy or undefined
 * parameters will default to zero.
 *
 * You can also pass a vector object instead of
 * individual components, to copy the object's components.
 * 
 * @method  set
 * @param {Number} x the x component
 * @param {Number} y the y component
 * @param {Number} z the z component
 * @param {Number} w the w component
 * @return {Vector2}  this, for chaining
 */

/**
 * Adds the components of the other Vector4 to
 * this vector.
 * 
 * @method add
 * @param  {Vector4} otherVec other vector, right operand
 * @return {Vector2}  this, for chaining
 */

/**
 * Subtracts the components of the other Vector4
 * from this vector. Aliased as `sub()`
 * 
 * @method  subtract
 * @param  {Vector4} otherVec other vector, right operand
 * @return {Vector2}  this, for chaining
 */

/**
 * Multiplies the components of this Vector4
 * by a scalar amount.
 *
 * @method  scale
 * @param {Number} s the scale to multiply by
 * @return {Vector4} this, for chaining
 */

/**
 * Returns the magnitude (length) of this vector.
 *
 * Aliased as `len()`
 * 
 * @method  length
 * @return {Number} the length of this vector
 */

/**
 * Returns the squared magnitude (length) of this vector.
 *
 * Aliased as `lenSq()`
 * 
 * @method  lengthSq
 * @return {Number} the squared length of this vector
 */

/**
 * Normalizes this vector to a unit vector.
 * @method normalize
 * @return {Vector4}  this, for chaining
 */

/**
 * Returns the dot product of this vector
 * and the specified Vector4.
 * 
 * @method dot
 * @return {Number} the dot product
 */
    copy: function(otherVec) {
        this.x = otherVec.x||0;
        this.y = otherVec.y||0;
        this.z = otherVec.z||0;
        this.w = otherVec.w||0;
        return this;
    },

    set: function(x, y, z, w) {
        if (typeof x === "object") {
            this.x = x.x||0;
            this.y = x.y||0;
            this.z = x.z||0;
            this.w = x.w||0;
        } else {
            this.x = x||0;
            this.y = y||0;
            this.z = z||0;
            this.w = w||0;

        }
        return this;
    },

    add: function(v) {
        this.x += v.x;
        this.y += v.y;
        this.z += v.z;
        this.w += v.w;
        return this;
    },

    subtract: function(v) {
        this.x -= v.x;
        this.y -= v.y;
        this.z -= v.z;
        this.w -= v.w;
        return this;
    },

    scale: function(s) {
        this.x *= s;
        this.y *= s;
        this.z *= s;
        this.w *= s;
        return this;
    },


    length: function() {
        var x = this.x,
            y = this.y,
            z = this.z,
            w = this.w;
        return Math.sqrt(x*x + y*y + z*z + w*w);
    },

    lengthSq: function() {
        var x = this.x,
            y = this.y,
            z = this.z,
            w = this.w;
        return x*x + y*y + z*z + w*w;
    },

    normalize: function() {
        var x = this.x,
            y = this.y,
            z = this.z,
            w = this.w;
        var len = x*x + y*y + z*z + w*w;
        if (len > 0) {
            len = 1 / Math.sqrt(len);
            this.x = x*len;
            this.y = y*len;
            this.z = z*len;
            this.w = w*len;
        }
        return this;
    },

    dot: function(v) {
        return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
    },

    lerp: function(v, t) {
        var ax = this.x,
            ay = this.y,
            az = this.z,
            aw = this.w;
        t = t||0;
        this.x = ax + t * (v.x - ax);
        this.y = ay + t * (v.y - ay);
        this.z = az + t * (v.z - az);
        this.w = aw + t * (v.w - aw);
        return this;
    }
};
},{}],19:[function(require,module,exports){
module.exports = {
    Vector2: require('./Vector2'),
    Vector3: require('./Vector3'),
    Vector4: require('./Vector4'),
    Matrix3: require('./Matrix3'),
    Matrix4: require('./Matrix4'),
    Quaternion: require('./Quaternion')
};
},{"./Matrix3":12,"./Matrix4":13,"./Quaternion":14,"./Vector2":15,"./Vector3":16,"./Vector4":17}]},{},[1])

            
          
!
999px
Loading ..................

Console