Initial commit.
authorMahlon E. Smith <mahlon@martini.nu>
Mon, 02 Sep 2013 02:22:21 -0700
changeset 0 80c32ef237c6
child 1 b3419d05eabb
Initial commit.
Rakefile
Resources/css/about.css
Resources/css/main.css
Resources/css/prefs.css
Resources/css/splash.css
Resources/font/batch/batch.eot
Resources/font/batch/batch.svg
Resources/font/batch/batch.ttf
Resources/font/batch/batch.woff
Resources/font/exo/exo-bold.eot
Resources/font/exo/exo-bold.svg
Resources/font/exo/exo-bold.ttf
Resources/font/exo/exo-bold.woff
Resources/font/exo/exo-regular.eot
Resources/font/exo/exo-regular.svg
Resources/font/exo/exo-regular.ttf
Resources/font/exo/exo-regular.woff
Resources/img/about/1.jpg
Resources/img/about/2.jpg
Resources/img/about/3.jpg
Resources/img/about/4.jpg
Resources/img/about/5.jpg
Resources/img/about/6.jpg
Resources/img/about/7.jpg
Resources/img/about/8.jpg
Resources/img/icon.png
Resources/img/splash.jpg
Resources/js/can.jquery-1.1.6.js
Resources/js/d/about.js
Resources/js/d/dascyllus.js
Resources/js/d/main.js
Resources/js/d/prefs.js
Resources/js/d/splash.js
Resources/js/flot-0.8.1-time.js
Resources/js/flot-0.8.1.js
Resources/js/jquery-2.0.3.js
Resources/js/processing-1.4.1.min.js
Resources/misc/blinky_squares.pjs
Resources/window/about.html
Resources/window/main.html
Resources/window/prefs.html
Resources/window/prefs/app.ejs
Resources/window/prefs/servers.ejs
Resources/window/splash.html
manifest
misc/batch_webfont_reference.pdf
sql/1.sql
tiapp.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Rakefile	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,15 @@
+#!rake
+# vim: set nosta noet ts=4 sw=4:
+
+require 'rake'
+require 'pathname'
+
+BASEDIR = Pathname.new( __FILE__ ).expand_path.dirname.relative_path_from( Pathname.getwd )
+
+task :default => [ :run ]
+
+desc "Compile and run the application"
+task :run do
+	sh 'tidebuilder.py', '-t', 'bundle', '-vd', '/tmp/', '-n', '.', '-r'
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/css/about.css	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,28 @@
+
+html {
+	/* border-radius: 4px; */
+	border: 2px solid #333;
+	height: 100%;
+}
+
+body {
+	background-image: url( 'app://img/about/1.jpg' );
+	width: 600px;
+	height: 432px;
+	text-shadow: none;
+	color: #000;
+	font-size: 14px;
+	height: 100%;
+	margin: 0;
+	padding: 0;
+}
+
+div {
+	padding: 10px;
+	background-color: #fff;
+	border-right: 1px solid #333;
+	opacity: 0.7;
+	max-width: 250px;
+	height: 100%;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/css/main.css	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,125 @@
+
+@font-face {
+	font-family: 'exo';
+	src: url('app://font/exo/exo-regular.eot');
+	src: url('app://font/exo/exo-regular.eot?#iefix') format('embedded-opentype'),
+		 url('app://font/exo/exo-regular.woff') format('woff'),
+		 url('app://font/exo/exo-regular.ttf') format('truetype'),
+		 url('app://font/exo/exo-regular.svg#batchregular') format('svg');
+	font-weight: normal;
+	font-style: normal;
+}
+
+@font-face {
+	font-family: 'exobold';
+	src: url('app://font/exo/exo-bold.eot');
+	src: url('app://font/exo/exo-bold.eot?#iefix') format('embedded-opentype'),
+		 url('app://font/exo/exo-bold.woff') format('woff'),
+		 url('app://font/exo/exo-bold.ttf') format('truetype'),
+		 url('app://font/exo/exo-bold.svg#batchregular') format('svg');
+	font-weight: normal;
+	font-style: normal;
+}
+
+/* http://adamwhitcroft.com/batch/ */
+@font-face {
+	font-family: 'batch';
+	src: url('app://font/batch/batch.eot');
+	src: url('app://font/batch/batch.eot?#iefix') format('embedded-opentype'),
+		 url('app://font/batch/batch.woff') format('woff'),
+		 url('app://font/batch/batch.ttf') format('truetype'),
+		 url('app://font/batch/batch.svg#batchregular') format('svg');
+	font-weight: normal;
+	font-style: normal;
+}
+
+a { 
+	text-decoration: none;
+	color: inherit !important;
+}
+
+.icon {
+	font-family: 'batch';
+	line-height: 1;
+	text-shadow: none;
+}
+
+body {
+	background-color: #333;
+	color: #fff;
+	margin: 10px;
+	padding: 0;
+	font-family: "exo", Helvetica, Geneva, sans-serif;
+	font-size: 1em;
+	text-shadow: 2px 2px 2px #000;
+}
+
+fieldset {
+	border: 1px inset #222;
+	border-radius: 5px;
+	background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #222 ), color-stop( 20%, #303030) );
+}
+
+/* button styles */
+/* ---------------------------------------------- */
+.button {
+	display: inline-block;
+	vertical-align: baseline;
+	margin: 0 2px;
+	outline: none;
+	cursor: pointer;
+	text-align: center;
+	text-decoration: none;
+	font: 14px/100% Arial, Helvetica, Geneva, sans-serif;
+	padding: .5em 2em .55em;
+	text-shadow: -1px -1px 0 rgba(0,0,0,0.3);
+	box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	border: 1px solid #7d99ca;
+	border-radius: 3px; 
+	color: #FFF;
+	background-color: #a5b8da;
+	background-image: -webkit-gradient( linear, left top, left bottom, from(#a5b8da), to(#7089b3) );
+}
+
+.button:hover {
+	border: 1px solid #5d7fbc;
+	background-color: #819bcb;
+	background-image: -webkit-gradient( linear, left top, left bottom, from(#819bcb), to(#536f9d) );
+ }
+
+.button:active {
+	position: relative;
+	top: 1px;
+}
+
+
+/* input field styles */
+/* ---------------------------------------------- */
+
+::-webkit-input-placeholder { color: #333; }
+
+input[type="text"],
+select {
+	font-family: "exo", Helvetica, Geneva, sans-serif;
+	font-size: 0.8em;
+	padding: 2px;
+	background-color: #888;
+	border-top: 1px solid #333;
+	border-right: 1px solid #777;
+	border-bottom: 1px solid #777;
+	border-left: 1px solid #333;
+	color: #000;
+	box-shadow: inset -4px 4px 10px #555;
+	border-radius: 3px;
+}
+
+input[type="text"]:active,
+select:active {
+	border: 1px solid #00ffff;
+}
+
+input[type="text"]:focus,
+select:focus {
+	background-color: #bbb;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/css/prefs.css	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,53 @@
+
+#test {
+	margin-top: 10px;
+}
+
+input[type="text"] {
+	width: 100%;
+}
+
+fieldset div {
+	text-align: right;
+	padding: 5px;
+}
+
+table {
+	text-align: right;
+	font-size: 0.8em;
+}
+
+.desc {
+	width: 100%;
+	padding-right: 10px;
+}
+
+.icon {
+	display: inline-block;
+	padding: 4px 10px;
+	font-size: 3em;
+}
+
+#sections {
+	text-align: center;
+	padding-left: 0px !important; /* override tide default style */
+}
+
+#sections li {
+	display: inline;
+	list-style-type: none;
+}
+
+#sections li a {
+	text-shadow: 2px 2px 1px #000;
+}
+
+#sections li a:active {
+	cursor: pointer;
+	text-shadow: none;
+	position: relative;
+	top: 1px;
+	left: 1px;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/css/splash.css	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,14 @@
+
+body {
+	color: #fff;
+	background-image: url( 'app://img/splash.jpg' );
+	width: 800px;
+	height: 450px;
+}
+
+div {
+	position: absolute;
+	font-size: 48px;
+	top: 20px;
+	left: 25px;
+}
Binary file Resources/font/batch/batch.eot has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/font/batch/batch.svg	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,360 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="batch_iconsregular" horiz-adv-x="2048" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="600" />
+<glyph />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" "  horiz-adv-x="600" />
+<glyph unicode="&#x09;" horiz-adv-x="600" />
+<glyph unicode="&#xa0;" horiz-adv-x="600" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5l256 -384l256 384h768q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 564v896q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896 q0 -53 -37.5 -90.5t-90.5 -37.5h-853l-171 -256l-171 256h-85q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf001;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h384l256 -384l256 384h384q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 564v896q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896 q0 -53 -37.5 -90.5t-90.5 -37.5h-469l-171 -256l-171 256h-469q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf002;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h768l256 -384l256 384q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 564v896q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896 q0 -53 -37.5 -90.5t-90.5 -37.5h-85l-171 -256l-171 256h-853q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf003;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5l256 -384l256 384h768q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 564v896q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896 q0 -53 -37.5 -90.5t-90.5 -37.5h-853l-171 -256l-171 256h-85q-53 0 -90.5 37.5t-37.5 90.5zM512 692h512v128h-512v-128zM512 948h1024v128h-1024v-128zM512 1204h1024v128h-1024v-128z" />
+<glyph unicode="&#xf004;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h384l256 -384l256 384h384q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 564v896q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896 q0 -53 -37.5 -90.5t-90.5 -37.5h-469l-171 -256l-171 256h-469q-53 0 -90.5 37.5t-37.5 90.5zM512 692h512v128h-512v-128zM512 948h1024v128h-1024v-128zM512 1204h1024v128h-1024v-128z" />
+<glyph unicode="&#xf005;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h768l256 -384l256 384q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 564v896q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896 q0 -53 -37.5 -90.5t-90.5 -37.5h-85l-171 -256l-171 256h-853q-53 0 -90.5 37.5t-37.5 90.5zM512 692h512v128h-512v-128zM512 948h1024v128h-1024v-128zM512 1204h1024v128h-1024v-128z" />
+<glyph unicode="&#xf006;" d="M0 564v896q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-896q0 -159 -112.5 -271.5t-271.5 -112.5h-768l-256 -384l-256 384q-159 0 -271.5 112.5t-112.5 271.5zM384 564h640v128h-640v-128zM384 820h1280v128h-1280v-128zM384 1076h1280v128 h-1280v-128zM384 1332h1280v128h-1280v-128z" />
+<glyph unicode="&#xf007;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h384l256 -384l256 384h384q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM384 564v128h640v-128h-640zM384 820v128h1280v-128h-1280zM384 1076v128h1280 v-128h-1280zM384 1332v128h1280v-128h-1280z" />
+<glyph unicode="&#xf008;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h768l256 -384l256 384q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM384 564v128h640v-128h-640zM384 820v128h1280v-128h-1280zM384 1076v128h1280 v-128h-1280zM384 1332v128h1280v-128h-1280z" />
+<glyph unicode="&#xf009;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5l256 -384l256 384h384q159 0 271.5 112.5t112.5 271.5v512q0 159 -112.5 271.5t-271.5 112.5h-896q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h896q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-469l-171 -256l-171 256h-85q-53 0 -90.5 37.5t-37.5 90.5zM408 1588h1000q159 0 271.5 -112.5t112.5 -271.5v-744q113 40 184.5 138t71.5 222v640q0 159 -112.5 271.5t-271.5 112.5h-896q-124 0 -222 -71.5t-138 -184.5z" />
+<glyph unicode="&#xf00a;" d="M0 820v640q0 159 112.5 271.5t271.5 112.5h896q124 0 222.5 -71.5t138.5 -184.5h-1001q-159 0 -271.5 -112.5t-112.5 -271.5v-744q-113 40 -184.5 138t-71.5 222zM384 564v512q0 159 112.5 271.5t271.5 112.5h896q159 0 271.5 -112.5t112.5 -271.5v-512 q0 -159 -112.5 -271.5t-271.5 -112.5l-256 -384l-256 384h-384q-159 0 -271.5 112.5t-112.5 271.5zM640 564q0 -53 37.5 -90.5t90.5 -37.5h469l171 -256l171 256h85q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-896q-53 0 -90.5 -37.5t-37.5 -90.5v-512z" />
+<glyph unicode="&#xf00b;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v896h1536v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1204v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM384 1332h128v128h-128v-128zM640 1332h128v128h-128v-128zM896 1332h768v128h-768v-128z" />
+<glyph unicode="&#xf00c;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v896h1536v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1204v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM384 1332h128v128h-128v-128zM640 436h256v-256h256v256h256v256h-256v256h-256v-256h-256v-256zM640 1332h128v128h-128v-128zM896 1332h768v128h-768v-128z" />
+<glyph unicode="&#xf00d;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v896h1536v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1204v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM384 1332h128v128h-128v-128zM640 436h768v256h-768v-256zM640 1332h128v128h-128v-128zM896 1332h768v128h-768v-128z" />
+<glyph unicode="&#xf00e;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v896h-1536v-896zM256 1204 h1536v256q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-256zM384 1332v128h128v-128h-128zM640 1332v128h128v-128h-128zM662 383l181 181l-181 181l181 181l181 -181l181 181l181 -181l-181 -181l181 -181l-181 -181l-181 181l-181 -181zM896 1332 v128h768v-128h-768z" />
+<glyph unicode="&#xf010;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h256v256h-256q-53 0 -90.5 37.5t-37.5 90.5v896h1536v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-256v-256h256q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5 v-1280zM256 1204v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM384 1332h128v128h-128v-128zM640 308h256v-512h256v512h256l-384 512zM640 1332h128v128h-128v-128zM896 1332h768v128h-768v-128z" />
+<glyph unicode="&#xf011;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h320l-160 256h-160q-53 0 -90.5 37.5t-37.5 90.5v896h1536v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-160l-160 -256h320q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5 t-112.5 -271.5v-1280zM256 1204v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM384 1332h128v128h-128v-128zM640 308l384 -512l384 512h-256v512h-256v-512h-256zM640 1332h128v128h-128v-128zM896 1332h768v128h-768v-128z" />
+<glyph unicode="&#xf012;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v896h1536v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1204v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM384 564h128v128h-128v-128zM384 820h128v128h-128v-128zM384 1332h128v128h-128v-128zM512 692h128v128h-128v-128zM640 436h256v128h-256v-128zM640 1332h128v128h-128v-128z M896 1332h768v128h-768v-128z" />
+<glyph unicode="&#xf013;" d="M0 180q0 -160 112.5 -272.5t271.5 -112.5h896q159 0 271.5 112.5t112.5 272.5v896q0 159 -112.5 271.5t-271.5 112.5h-896q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 180v512h1152v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-896q-53 0 -90.5 37.5t-37.5 90.5zM256 820 v256q0 53 37.5 90.5t90.5 37.5h896q53 0 90.5 -37.5t37.5 -90.5v-256h-1152zM384 948h128v128h-128v-128zM408 1588h1000q159 0 271.5 -112.5t112.5 -271.5v-1001q113 40 184.5 138.5t71.5 222.5v896q0 159 -112.5 271.5t-271.5 112.5h-896q-123 0 -221.5 -71t-138.5 -185z M640 948h128v128h-128v-128zM896 948h384v128h-384v-128z" />
+<glyph unicode="&#xf014;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1152h1536v-1152q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf015;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1152h1536v-1152q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM640 564h256v-256h256v256h256v256h-256v256h-256v-256h-256v-256z" />
+<glyph unicode="&#xf016;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1152h1536v-1152q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM640 564v256h768v-256h-768z" />
+<glyph unicode="&#xf017;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1152h1536v-1152q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM662 511l181 -181l181 181l181 -181l181 181l-181 181l181 181l-181 181l-181 -181l-181 181l-181 -181l181 -181z" />
+<glyph unicode="&#xf018;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h256v256h-256q-53 0 -90.5 37.5t-37.5 90.5v1152h1536v-1152q0 -53 -37.5 -90.5t-90.5 -37.5h-256v-256h256q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5 v-1280zM256 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM640 308h256v-512h256v512h256l-384 512z" />
+<glyph unicode="&#xf019;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-320l160 256h160q53 0 90.5 37.5t37.5 90.5v1152h-1536v-1152q0 -53 37.5 -90.5t90.5 -37.5h160l160 -256h-320q-159 0 -271.5 112.5 t-112.5 271.5zM256 1588q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM640 308h256v512h256v-512h256l-384 -512z" />
+<glyph unicode="&#xf01a;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1152h1536v-1152q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z M256 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM768 692h128v128h-128v-128zM768 948h128v128h-128v-128zM896 820h128v128h-128v-128zM1024 564h256v128h-256v-128z" />
+<glyph unicode="&#xf01b;" d="M0 180q0 -160 112.5 -272.5t271.5 -112.5h896q159 0 271.5 112.5t112.5 272.5v896q0 159 -112.5 271.5t-271.5 112.5h-896q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 180v768h1152v-768q0 -53 -37.5 -90.5t-90.5 -37.5h-896q-53 0 -90.5 37.5t-37.5 90.5zM256 1204 q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -91t-90.5 -38t-90.5 38t-37.5 91zM408 1588h1000q159 0 271.5 -112.5t112.5 -271.5v-1001q113 40 184.5 138.5t71.5 222.5v896q0 159 -112.5 271.5t-271.5 112.5h-896q-124 0 -222 -71.5t-138 -184.5z" />
+<glyph unicode="&#xf01c;" d="M0 180q0 -160 112.5 -272.5t271.5 -112.5h896q159 0 271.5 112.5t112.5 272.5v896q0 159 -112.5 271.5t-271.5 112.5h-896q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 180v896q0 53 37.5 90.5t90.5 37.5h896q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5 t-90.5 -37.5h-896q-53 0 -90.5 37.5t-37.5 90.5zM408 1588h1000q159 0 271.5 -112.5t112.5 -271.5v-1001q113 40 184.5 138.5t71.5 222.5v896q0 159 -112.5 271.5t-271.5 112.5h-896q-124 0 -222 -71.5t-138 -184.5z" />
+<glyph unicode="&#xf01d;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 820q0 -53 37.5 -90.5t90.5 -37.5h256v-256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v256h256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-256v256q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5v-256h-256q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf01e;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 820q0 -53 37.5 -90.5t90.5 -37.5h768q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-768q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf020;" d="M0 180h256q0 -53 37.5 -90.5t90.5 -37.5v-256q-159 0 -271.5 112.5t-112.5 271.5zM0 436v256h256v-256h-256zM0 948v256h256v-256h-256zM0 1460q0 159 112.5 271.5t271.5 112.5v-256q-53 0 -90.5 -37.5t-37.5 -90.5h-256zM640 52h256v-256h-256v256zM640 1588v256h256 v-256h-256zM1152 52h256v-256h-256v256zM1152 1588v256h256v-256h-256zM1664 52q53 0 90.5 37.5t37.5 90.5h256q0 -159 -112.5 -271.5t-271.5 -112.5v256zM1664 1588v256q159 0 271.5 -112.5t112.5 -271.5h-256q0 53 -37.5 90.5t-90.5 37.5zM1792 436v256h256v-256h-256z M1792 948v256h256v-256h-256z" />
+<glyph unicode="&#xf021;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5v256q-53 0 -90.5 37.5t-37.5 90.5h-256zM0 436h256v256h-256v-256zM0 948h256v256h-256v-256zM0 1460h256q0 53 37.5 90.5t90.5 37.5v256q-159 0 -271.5 -112.5t-112.5 -271.5zM512 692h384v-384h256v384h384v256h-384v384h-256 v-384h-384v-256zM640 52v-256h256v256h-256zM640 1588h256v256h-256v-256zM1152 52v-256h256v256h-256zM1152 1588h256v256h-256v-256zM1664 52v-256q159 0 271.5 112.5t112.5 271.5h-256q0 -53 -37.5 -90.5t-90.5 -37.5zM1664 1588q53 0 90.5 -37.5t37.5 -90.5h256 q0 159 -112.5 271.5t-271.5 112.5v-256zM1792 436h256v256h-256v-256zM1792 948h256v256h-256v-256z" />
+<glyph unicode="&#xf022;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5v256q-53 0 -90.5 37.5t-37.5 90.5h-256zM0 436h256v256h-256v-256zM0 948h256v256h-256v-256zM0 1460h256q0 53 37.5 90.5t90.5 37.5v256q-159 0 -271.5 -112.5t-112.5 -271.5zM512 692v256h1024v-256h-1024zM640 52v-256h256 v256h-256zM640 1588h256v256h-256v-256zM1152 52v-256h256v256h-256zM1152 1588h256v256h-256v-256zM1664 52v-256q159 0 271.5 112.5t112.5 271.5h-256q0 -53 -37.5 -90.5t-90.5 -37.5zM1664 1588q53 0 90.5 -37.5t37.5 -90.5h256q0 159 -112.5 271.5t-271.5 112.5v-256z M1792 436h256v256h-256v-256zM1792 948h256v256h-256v-256z" />
+<glyph unicode="&#xf023;" d="M0 180h256q0 -53 37.5 -90.5t90.5 -37.5v-256q-159 0 -271.5 112.5t-112.5 271.5zM0 436v256h256v-256h-256zM0 948v256h256v-256h-256zM0 1460q0 159 112.5 271.5t271.5 112.5v-256q-53 0 -90.5 -37.5t-37.5 -90.5h-256zM640 52h256v-256h-256v256zM640 820l384 512 l384 -512h-256v-512h-256v512h-256zM640 1588v256h256v-256h-256zM1152 52h256v-256h-256v256zM1152 1588v256h256v-256h-256zM1664 52q53 0 90.5 37.5t37.5 90.5h256q0 -159 -112.5 -271.5t-271.5 -112.5v256zM1664 1588v256q159 0 271.5 -112.5t112.5 -271.5h-256 q0 53 -37.5 90.5t-90.5 37.5zM1792 436v256h256v-256h-256zM1792 948v256h256v-256h-256z" />
+<glyph unicode="&#xf024;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5v256q-53 0 -90.5 37.5t-37.5 90.5h-256zM0 436h256v256h-256v-256zM0 948h256v256h-256v-256zM0 1460h256q0 53 37.5 90.5t90.5 37.5v256q-159 0 -271.5 -112.5t-112.5 -271.5zM640 52v-256h256v256h-256zM640 820l384 -512 l384 512h-256v512h-256v-512h-256zM640 1588h256v256h-256v-256zM1152 52v-256h256v256h-256zM1152 1588h256v256h-256v-256zM1664 52v-256q159 0 271.5 112.5t112.5 271.5h-256q0 -53 -37.5 -90.5t-90.5 -37.5zM1664 1588q53 0 90.5 -37.5t37.5 -90.5h256 q0 159 -112.5 271.5t-271.5 112.5v-256zM1792 436h256v256h-256v-256zM1792 948h256v256h-256v-256z" />
+<glyph unicode="&#xf025;" d="M0 180q0 -83 37 -162l219 219v1162l-220 220q-36 -75 -36 -159v-1280zM214 1803l215 -215h1190l215 215q-85 41 -170 41h-1280q-85 0 -170 -41zM217 -164q82 -40 167 -40h1280q87 0 167 40l-216 216h-1182zM512 308h1024v256h-1024v-256zM512 692h1024v256h-1024v-256z M512 1076h1024v256h-1024v-256zM1792 237l219 -219q37 79 37 162v1280q0 83 -35 159l-221 -220v-1162z" />
+<glyph unicode="&#xf026;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 308v256h256v-256h-256zM512 692v256h256v-256h-256zM512 1076v256h256v-256h-256zM896 308v256h256v-256h-256zM896 692v256h256v-256h-256zM896 1076v256h256v-256h-256zM1280 308v256h256v-256h-256z M1280 692v256h256v-256h-256zM1280 1076v256h256v-256h-256z" />
+<glyph unicode="&#xf027;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 308h384v384h-384v-384zM512 948h384v384h-384v-384zM640 436v128h128v-128h-128zM640 1076v128h128v-128h-128zM1152 308h384v384h-384v-384zM1152 948h384v384h-384v-384zM1280 436v128h128v-128 h-128zM1280 1076v128h128v-128h-128z" />
+<glyph unicode="&#xf028;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 308v256h256v-256h-256zM512 692v256h256v-256h-256zM512 1076v256h256v-256h-256zM896 308v256h640v-256h-640zM896 692v256h640v-256h-640zM896 1076v256h640v-256h-640z" />
+<glyph unicode="&#xf029;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 308h384v384h-384v-384zM512 948h384v384h-384v-384zM640 436v128h128v-128h-128zM640 1076v128h128v-128h-128zM1024 436h512v128h-512v-128zM1024 1076h512v128h-512v-128z" />
+<glyph unicode="&#xf02a;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-256h256v256q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5 t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v256h-256v-256zM0 692h512v-256l512 384l-512 384v-256h-512v-256z" />
+<glyph unicode="&#xf02b;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-320l256 160v160q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5 t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v160l-256 160v-320zM0 820l512 -384v256h512v256h-512v256z" />
+<glyph unicode="&#xf02c;" d="M0 180q0 -160 114.5 -272t269.5 -112h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-256v-256h256q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v1280q0 53 37.5 90.5t90.5 37.5 h256v256h-256q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM384 180h1280l-256 384h-768zM640 1332l384 -512l384 512h-256v512h-256v-512h-256z" />
+<glyph unicode="&#xf02d;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-320l160 -256h160q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v1280q0 53 37.5 90.5 t90.5 37.5h160l160 256h-320q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM384 180h1280l-256 384h-768zM640 1332h256v-512h256v512h256l-384 512z" />
+<glyph unicode="&#xf02e;" d="M0 214q0 -151 106.5 -257.5t257.5 -106.5h1212q151 0 257.5 106.5t106.5 257.5v525l-242 -202v-323q0 -50 -36 -86t-86 -36h-1212q-50 0 -85.5 36t-35.5 86v1212q0 50 35.5 86t85.5 36h606v242h-606q-151 0 -257.5 -106.5t-106.5 -257.5v-1212zM364 577q0 -176 70 -338 q33 189 142.5 343t276 247.5t359.5 106.5v-359l728 607l-728 606v-364q-172 0 -329 -67t-271 -181t-181 -271t-67 -330zM2047 432l1 -1v1h-1z" />
+<glyph unicode="&#xf030;" d="M0 -76h1024v256h-1024v-256zM0 436h2048v256h-2048v-256zM0 948h2048v256h-2048v-256zM0 1460h2048v256h-2048v-256z" />
+<glyph unicode="&#xf031;" d="M0 -76h1280v256h-1280v-256zM0 436h1792v256h-1792v-256zM0 948h1536v256h-1536v-256zM0 1460h2048v256h-2048v-256z" />
+<glyph unicode="&#xf032;" d="M0 1460h2048v256h-2048v-256zM128 436h1792v256h-1792v-256zM256 948h1536v256h-1536v-256zM384 -76h1280v256h-1280v-256z" />
+<glyph unicode="&#xf033;" d="M0 1460v256h2048v-256h-2048zM256 436v256h1792v-256h-1792zM512 948v256h1536v-256h-1536zM768 -76v256h1280v-256h-1280z" />
+<glyph unicode="&#xf034;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 436h512v128h-512v-128zM512 692h1024v128h-1024v-128zM512 948h1024v128h-1024v-128zM512 1204h1024v128h-1024v-128z" />
+<glyph unicode="&#xf035;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 436h384v128h-384v-128zM512 692h640v128h-640v-128zM512 948h512v128h-512v-128zM512 1204h768v128h-768v-128z" />
+<glyph unicode="&#xf036;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 1204h1024v128h-1024v-128zM640 692h768v128h-768v-128zM768 948h512v128h-512v-128zM896 436h256v128h-256v-128z" />
+<glyph unicode="&#xf037;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM768 1204h768v128h-768v-128zM896 692h640v128h-640v-128zM1024 948h512v128h-512v-128zM1152 436h384v128h-384v-128z" />
+<glyph unicode="&#xf038;" d="M0 692q0 -159 113.5 -271.5t274.5 -112.5h130l647 -512v2048l-647 -512h-130q-161 0 -274.5 -112.5t-113.5 -271.5v-256zM259 692v256q0 53 38 90.5t91 37.5h259l259 256v-1024l-259 256h-259q-53 0 -91 37.5t-38 90.5zM1316 639l183 -181l183 181l183 -181l183 181 l-183 181l183 181l-183 181l-183 -181l-183 181l-183 -181l183 -181z" />
+<glyph unicode="&#xf039;" d="M0 692q0 -159 113.5 -271.5t274.5 -112.5h130l647 -512v2048l-647 -512h-130q-161 0 -274.5 -112.5t-113.5 -271.5v-256zM259 692v256q0 53 38 90.5t91 37.5h259l259 256v-1024l-259 256h-259q-53 0 -91 37.5t-38 90.5z" />
+<glyph unicode="&#xf03a;" d="M0 692q0 -159 113.5 -271.5t274.5 -112.5h130l647 -512v2048l-647 -512h-130q-161 0 -274.5 -112.5t-113.5 -271.5v-256zM259 692v256q0 53 38 90.5t91 37.5h259l259 256v-1024l-259 256h-259q-53 0 -91 37.5t-38 90.5zM1289 326q168 43 276 180t108 314t-108 314 t-276 180v-274q58 -34 93 -92.5t35 -127.5q0 -70 -35 -128t-93 -93v-273z" />
+<glyph unicode="&#xf03b;" d="M0 692q0 -159 113.5 -271.5t274.5 -112.5h130l647 -512v2048l-647 -512h-130q-161 0 -274.5 -112.5t-113.5 -271.5v-256zM259 692v256q0 53 38 90.5t91 37.5h259l259 256v-1024l-259 256h-259q-53 0 -91 37.5t-38 90.5zM1280 99v-269q219 56 393.5 198.5t274.5 350 t100 441.5t-100 441.5t-274.5 350t-393.5 199.5v-270q227 -81 369.5 -277.5t142.5 -443.5t-142.5 -443.5t-369.5 -277.5zM1280 326q168 43 276 180t108 314t-108 314t-276 180v-273q58 -35 93 -93t35 -128q0 -69 -35 -127.5t-93 -92.5v-274z" />
+<glyph unicode="&#xf03c;" d="M0 820q0 -53 37.5 -90.5t90.5 -37.5h128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5zM262 187q0 -53 38 -91t91 -38t90 38l91 90q38 38 38 91t-38 90t-91 37t-90 -37l-91 -90q-38 -37 -38 -90zM262 1453q0 -53 38 -90l91 -90 q37 -37 90 -37t91 37t38 90t-38 91l-91 90q-37 38 -90 38t-91 -38t-38 -91zM512 820q0 -212 150 -362t362 -150t362 150t150 362t-150 362t-362 150t-362 -150t-150 -362zM768 820q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM896 52v-128 q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 1588q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-128zM1440 277q0 -53 37 -91l90 -90 q37 -38 90 -38t91 38t38 91t-38 90l-90 90q-38 37 -91 37t-90 -37t-37 -90zM1440 1363q0 -53 37 -90t90 -37t91 37l90 90q38 37 38 90t-38 91t-91 38t-90 -38l-90 -90q-37 -38 -37 -91zM1664 820q0 -53 37.5 -90.5t90.5 -37.5h128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5 t-90.5 37.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf03d;" d="M128 820q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM352 277q0 -53 38 -91t91 -38t90 38t37 91t-37 90t-90 37t-91 -37t-38 -90zM352 1363q0 -53 38 -90t91 -37t90 37t37 90t-37 91t-90 38t-91 -38t-38 -91z M512 820q0 -212 150 -362t362 -150t362 150t150 362t-150 362t-362 150t-362 -150t-150 -362zM768 820q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM896 52q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM896 1588q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1440 277q0 -53 37 -91t90 -38t91 38t38 91t-38 90t-91 37t-90 -37t-37 -90zM1440 1363q0 -53 37 -90t90 -37t91 37t38 90t-38 91 t-91 38t-90 -38t-37 -91zM1664 820q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf03e;" d="M0 820q0 -208 81 -398t218.5 -327t327 -218t397.5 -81q209 0 398.5 81t326.5 218t218 326.5t81 398.5t-81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM1024 180q174 0 321.5 86t233 233t85.5 321t-85.5 321t-233 233t-321.5 86v-1280z" />
+<glyph unicode="&#xf040;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 308q0 -53 37.5 -90.5t90.5 -37.5h1024q53 0 90.5 37.5t37.5 90.5v60q-13 29 -71.5 172.5t-101.5 230t-83 133.5q-33 38 -70.5 40.5t-73 -24.5t-74.5 -72t-75 -100t-75 -110.5t-73 -101.5t-71 -75 t-68 -29q-37 0 -108 91q-10 13 -29 40q-72 95 -104 117q-48 33 -75 -24q-15 -32 -59.5 -142t-68.5 -164v-42zM384 1268q0 -80 56 -136t136 -56t136 56t56 136t-56 136t-136 56t-136 -56t-56 -136z" />
+<glyph unicode="&#xf041;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 308h128v-128h128v1280h-256v-128h128v-128h-128v-128h128v-128h-128v-128h128v-128h-128v-128h128v-128h-128v-128zM768 180h512v256h-512v-256zM768 564h512v512h-512v-512zM768 1204h512v256h-512 v-256zM1408 180h128v128h128v128h-128v128h128v128h-128v128h128v128h-128v128h128v128h-128v128h128v128h-256v-1280z" />
+<glyph unicode="&#xf042;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v768h-1536v-768zM256 1332 h128v-128h256v128h128v-128h256v128h128v-128h256v128h128v-128h256v256q0 53 -37.5 90.5t-90.5 37.5h-128v-128h-128v128h-256v-128h-128v128h-256v-128h-128v128h-256v-128h-128v-128zM384 180v128h896v-128h-896zM384 436v128h1152v-128h-1152zM384 692v128h1152v-128 h-1152zM384 1332v128h128v-128h-128zM768 1332v128h128v-128h-128zM1152 1332v128h128v-128h-128zM1536 1332v128h128v-128h-128z" />
+<glyph unicode="&#xf043;" d="M68 -204h1912q0 121 -88.5 228.5t-243 183t-351.5 109.5v101q125 72 199 197t74 273v14q60 21 98.5 73t38.5 118t-38.5 118t-98.5 73v14q0 148 -73 274t-199 199t-274 73t-274 -73t-199 -199t-73 -274v-14q-60 -21 -98.5 -73t-38.5 -118t38.5 -118t98.5 -73v-14 q0 -148 74 -273t199 -197v-101q-197 -34 -351.5 -109.5t-243 -183t-88.5 -228.5z" />
+<glyph unicode="&#xf044;" d="M256 180q0 -159 113.5 -271.5t270.5 -112.5h768q159 0 271.5 112.5t112.5 271.5q-29 172 -136 314.5t-262 228.5q142 150 142 353v256q0 212 -150 362t-362 150t-362 -150t-150 -362v-256q0 -203 142 -353q-154 -86 -261.5 -228.5t-136.5 -314.5zM512 180 q43 166 188.5 275t323.5 109t323.5 -109t188.5 -275q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM768 1076v256q0 106 75 181t181 75t181 -75t75 -181v-256q0 -106 -75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf045;" d="M0 180q0 -159 113.5 -271.5t270.5 -112.5h768q159 0 271.5 112.5t112.5 271.5q-29 172 -136 314.5t-262 228.5q142 150 142 353v256q0 212 -150 362t-362 150t-362 -150t-150 -362v-256q0 -203 142 -353q-154 -86 -261.5 -228.5t-136.5 -314.5zM256 179q43 166 188.5 275 t323.5 109t323.5 -109t188.5 -275q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM512 1075v256q0 106 75 181t181 75t181 -75t75 -181v-256q0 -106 -75 -181t-181 -75t-181 75t-75 181zM1165 1830q58 14 115 14q212 0 362 -150t150 -362v-257 q0 -203 -142 -353q155 -86 262 -228.5t136 -314.5q0 -159 -112.5 -271.5t-271.5 -112.5h-177q120 104 159 256h18q53 0 90.5 37.5t37.5 90.5q-24 94 -85 172.5t-148 131.5q-93 161 -238 272q23 40 39 79q78 26 127 92t49 150v256q0 84 -49 150t-127 92q-61 149 -195 256z " />
+<glyph unicode="&#xf046;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM640 372q0 -36 15 -73q167 -119 369 -119t369 119q16 36 15 73q-15 86 -68.5 157.5t-130.5 114.5q71 74 71 176v128q0 106 -75 181t-181 75t-181 -75t-75 -181v-128 q0 -102 71 -176q-77 -43 -130.5 -114.5t-68.5 -157.5z" />
+<glyph unicode="&#xf047;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 308v1152q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1152h-1536zM640 628 q0 -80 57 -136t135 -56h384q80 0 136 56t56 136q-15 86 -68.5 157.5t-130.5 114.5q71 74 71 176v128q0 106 -75 181t-181 75t-181 -75t-75 -181v-128q0 -102 71 -176q-77 -43 -130.5 -114.5t-68.5 -157.5z" />
+<glyph unicode="&#xf048;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 308v1152q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1152h-1536zM640 628 q0 -80 57 -136t135 -56h384q80 0 136 56t56 136q-15 86 -68.5 157.5t-130.5 114.5q71 74 71 176v128q0 106 -75 181t-181 75t-181 -75t-75 -181v-128q0 -102 71 -176q-77 -43 -130.5 -114.5t-68.5 -157.5zM768 628q22 83 94.5 137.5t161.5 54.5t161.5 -54.5t94.5 -137.5 q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM896 1076v128q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf049;" d="M17 1066q35 -132 133 -230l874 -906l874 906q98 98 133 230t0 264t-133 230t-230 133t-264.5 0t-230.5 -133l-149 -181l-149 181q-98 98 -230.5 133t-264.5 0t-230 -133t-133 -230t0 -264z" />
+<glyph unicode="&#xf04a;" d="M17 1067.5q35 -132.5 133 -231.5l874 -912l874 912q98 99 133 231.5t0 265.5t-133 232t-230 134t-264.5 0t-230.5 -134l-149 -182l-149 182q-98 99 -230.5 134t-264.5 0t-230 -134t-133 -232t0 -265.5zM1024 289v729l330 365q75 75 181.5 75t181.5 -75q75 -76 75 -182.5 t-75 -182.5z" />
+<glyph unicode="&#xf04b;" d="M17 1067.5q35 -132.5 133 -231.5l874 -912l874 912q98 99 133 231.5t0 265.5t-133 232t-230 134t-264.5 0t-230.5 -134l-149 -182l-149 182q-98 99 -230.5 134t-264.5 0t-230 -134t-133 -232t0 -265.5zM256 1200.5q0 106.5 75 182.5q75 75 181.5 75t181.5 -75l330 -365 l330 365q75 75 181.5 75t181.5 -75q75 -76 75 -182.5t-75 -182.5l-693 -729l-693 729q-75 76 -75 182.5z" />
+<glyph unicode="&#xf04c;" d="M0 820q0 53 37.5 90.5t90.5 37.5h128q2 0 4 -0.5t4.5 -1.5t4.5 -1q28 175 132 321q-8 4 -10 6l-91 91q-38 37 -38 90t38 91t91 38t90 -38l91 -91q2 -2 6 -10q146 104 321 132q0 2 -1.5 6.5t-1.5 6.5v128q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-128q0 -2 -1 -6 t-1 -7q174 -28 320 -132q4 8 7 11l90 90q37 38 90 38t91 -38t38 -91t-38 -90l-90 -90q-3 -3 -11 -7q104 -146 132 -321q2 0 6.5 1.5t6.5 1.5h128q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-128q-2 0 -6.5 1.5t-6.5 1.5q-28 -175 -132 -321q8 -4 11 -7l90 -90 q38 -37 38 -90t-38 -91t-91 -38t-90 38l-90 90q-3 3 -7 11q-146 -104 -320 -132q0 -3 1 -7t1 -6v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128q0 2 1.5 6.5t1.5 6.5q-175 28 -321 132q-5 -10 -6 -11l-91 -90q-37 -38 -90 -38t-91 38t-38 91t38 90l91 90 q4 4 10 7q-104 146 -132 321q-1 0 -5.5 -1.5t-7.5 -1.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM512 820q0 -212 150 -362t362 -150t362 150t150 362t-150 362t-362 150t-362 -150t-150 -362z" />
+<glyph unicode="&#xf04d;" d="M0 820q0 53 37.5 90.5t90.5 37.5h128q2 0 4 -0.5t4.5 -1.5t4.5 -1q28 175 132 321q-8 4 -10 6l-91 91q-38 37 -38 90t38 91t91 38t90 -38l91 -91q2 -2 6 -10q146 104 321 132q0 2 -1.5 6.5t-1.5 6.5v128q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-128q0 -2 -1 -6 t-1 -7q174 -28 320 -132q4 8 7 11l90 90q37 38 90 38t91 -38t38 -91t-38 -90l-90 -90q-3 -3 -11 -7q104 -146 132 -321q2 0 6.5 1.5t6.5 1.5h128q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-128q-2 0 -6.5 1.5t-6.5 1.5q-28 -175 -132 -321q8 -4 11 -7l90 -90 q38 -37 38 -90t-38 -91t-91 -38t-90 38l-90 90q-3 3 -7 11q-146 -104 -320 -132q0 -3 1 -7t1 -6v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128q0 2 1.5 6.5t1.5 6.5q-175 28 -321 132q-5 -10 -6 -11l-91 -90q-37 -38 -90 -38t-91 38t-38 91t38 90l91 90 q4 4 10 7q-104 146 -132 321q-1 0 -5.5 -1.5t-7.5 -1.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM640 820q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5z" />
+<glyph unicode="&#xf04e;" d="M0 1204q0 53 37.5 90.5t90.5 37.5h18q16 64 54 131l-12 12q-38 37 -38 90t38 91t91 38t90 -38l12 -12q66 37 131 54v18q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-18q64 -16 131 -54l13 12q37 37 90.5 37.5t90.5 -36.5t37 -90t-37 -91l-13 -13q38 -67 54 -131h18 q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-18q-16 -64 -54 -131l13 -13q37 -38 37 -91t-37 -90t-90 -37t-91 37l-13 13q-67 -38 -131 -54v-18q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v18q-65 17 -131 54l-12 -13q-37 -37 -90 -37t-91 37t-38 90 t38 91l12 13q-38 67 -54 131h-18q-53 0 -90.5 37.5t-37.5 90.5zM384 1204q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1024 308q0 53 37.5 90.5t90.5 37.5h24q6 17 14 37l-16 16q-38 37 -38 90t38 91t91 38t90 -38l16 -16q20 8 37 14v24 q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-24q13 -4 37 -14l16 16q37 38 90 38t91 -38t38 -91t-38 -90l-16 -16q2 -6 7 -18.5t8 -18.5h23q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-23q-5 -13 -15 -37l16 -16q38 -37 38 -90t-38 -91t-91 -38t-90 38 l-16 16l-37 -15v-23q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v23l-37 15l-16 -16q-37 -38 -90 -38t-91 38t-38 91t38 90l16 16q-10 24 -14 37h-24q-53 0 -90.5 37.5t-37.5 90.5zM1280 308q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75 t-75 -181z" />
+<glyph unicode="&#xf050;" d="M0 180.5q0 -158.5 112 -271.5q113 -113 272 -113h1280q159 0 272 113q112 113 112 272t-112 271l-528 527v609q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-768q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5v-609l-528 -527q-112 -113 -112 -271.5z M256.5 180.5q0.5 53.5 37.5 90.5l602 602v715h256v-715l603 -602q37 -38 37 -91t-37 -90q-38 -38 -91 -38h-1280q-53 0 -91 38q-37 37 -36.5 90.5zM384 180l256 256h768l256 -256h-1280z" />
+<glyph unicode="&#xf051;" d="M0 180q0 159 112 272l528 527v609q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-609l528 -527q112 -112 112 -271.5t-112 -272.5q-112 -112 -272 -112h-1280q-160 0 -272 112q-112 113 -112 272z M256.5 180.5q-0.5 -53.5 36.5 -90.5q38 -38 91 -38h1280q53 0 91 38q37 37 37 90t-37 91l-603 602v715h-256v-715l-602 -602q-37 -37 -37.5 -90.5z" />
+<glyph unicode="&#xf052;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM256 1524 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM640 180q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM768 948q0 -53 37.5 -90.5t90.5 -37.5h256 q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-384zM1664 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1664 1524q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf053;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM256 1524 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM640 180q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM768 308q0 -53 37.5 -90.5t90.5 -37.5h256 q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-384zM1664 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1664 1524q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf054;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM256 564 q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-512zM256 1524q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 692q0 -53 37.5 -90.5t90.5 -37.5h384 q53 0 90.5 37.5t37.5 90.5v256q0 53 -37.5 90.5t-90.5 37.5h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-256zM1664 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1664 1524q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf055;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM256 564 q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-512zM256 1524q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1024 692q0 -53 37.5 -90.5t90.5 -37.5h384 q53 0 90.5 37.5t37.5 90.5v256q0 53 -37.5 90.5t-90.5 37.5h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-256zM1664 116q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1664 1524q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf056;" d="M128 1332q0 -53 37.5 -90.5t90.5 -37.5v-1024q0 -159 112.5 -271.5t271.5 -112.5h768q159 0 271.5 112.5t112.5 271.5v1024q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-384q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5h-384q-53 0 -90.5 -37.5 t-37.5 -90.5zM512 180v1024h1024v-1024q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM640 180h128v896h-128v-896zM896 180h256v896h-256v-896zM896 1460q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5h-256zM1280 180h128v896h-128v-896z" />
+<glyph unicode="&#xf057;" d="M256 1460l256 -1408q0 -69 68.5 -128t186.5 -93.5t257 -34.5t257 34.5t186.5 93.5t68.5 128l256 1408q0 104 -103 192.5t-279.5 140t-385.5 51.5t-385.5 -51.5t-279.5 -140t-103 -192.5zM512 1460q0 69 68.5 128t186.5 93.5t257 34.5t257 -34.5t186.5 -93.5t68.5 -128 t-68.5 -128t-186.5 -93.5t-257 -34.5t-257 34.5t-186.5 93.5t-68.5 128z" />
+<glyph unicode="&#xf058;" d="M0 180q0 -124 71.5 -222.5t184.5 -138.5v745q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-745q113 40 184.5 138.5t71.5 222.5v1280q0 124 -71.5 222t-184.5 138v-744q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v744 q-113 -40 -184.5 -138t-71.5 -222v-1280zM384 -76q0 -53 37.5 -90.5t90.5 -37.5h1024q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-1024q-53 0 -90.5 -37.5t-37.5 -90.5v-512zM640 1204q0 -53 37.5 -90.5t90.5 -37.5h768q53 0 90.5 37.5t37.5 90.5v512 q0 53 -37.5 90.5t-90.5 37.5h-768q-53 0 -90.5 -37.5t-37.5 -90.5v-512zM1280 1332v256q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf059;" d="M0 -76q0 -53 37.5 -90.5t90.5 -37.5h512v64q0 26 19 45t45 19t45 -19t19 -45v-64h512v64q0 26 19 45t45 19t45 -19t19 -45v-64h256v192q0 26 19 45t45 19t45 -19t19 -45v-192h128q53 0 90.5 37.5t37.5 90.5v1792q0 53 -37.5 90.5t-90.5 37.5h-1792q-53 0 -90.5 -37.5 t-37.5 -90.5v-1792zM128 1460v128q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM256 1460h896v128h-896v-128zM640 820q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5 t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM768 820q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM896 52v128q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z M896 820q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf05a;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 124 -71.5 222t-184.5 138v-168q0 -80 -56 -136t-136 -56t-136 56t-56 136v192h-768v-192q0 -80 -56 -136t-136 -56t-136 56t-56 136v168q-113 -40 -184.5 -138t-71.5 -222v-1280z M256 180v1024h1536v-1024q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 180h640v128h-640v-128zM384 436h1280v128h-1280v-128zM384 692h1280v128h-1280v-128zM384 948h1280v128h-1280v-128zM384 1652q0 -26 19 -45t45 -19t45 19t19 45v192h-128 v-192zM1536 1652q0 -26 19 -45t45 -19t45 19t19 45v192h-128v-192z" />
+<glyph unicode="&#xf05b;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 124 -71.5 222t-184.5 138v-168q0 -80 -56 -136t-136 -56t-136 56t-56 136v192h-768v-192q0 -80 -56 -136t-136 -56t-136 56t-56 136v168q-113 -40 -184.5 -138t-71.5 -222v-1280z M256 180v1024h1536v-1024q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 1652q0 -26 19 -45t45 -19t45 19t19 45v192h-128v-192zM512 308h256v256h-256v-256zM512 692h256v256h-256v-256zM896 308h256v256h-256v-256zM896 692h256v256h-256v-256z M1280 308h256v256h-256v-256zM1280 692h256v256h-256v-256zM1536 1652q0 -26 19 -45t45 -19t45 19t19 45v192h-128v-192z" />
+<glyph unicode="&#xf05c;" d="M0 308q0 -53 37.5 -90.5t90.5 -37.5h128q0 -159 113.5 -271.5t270.5 -112.5h429q-138 97 -221 256h-208q-53 0 -90.5 37.5t-37.5 90.5v1280q0 53 37.5 90.5t90.5 37.5h1024q53 0 90.5 -37.5t37.5 -90.5v-464q159 -83 256 -221v685q0 159 -112.5 271.5t-271.5 112.5h-1024 q-159 0 -271.5 -112.5t-112.5 -271.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5h128v-256h-128q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5h128v-256h-128q-53 0 -90.5 -37.5t-37.5 -90.5zM640 308h135q0 5 -3.5 28t-3.5 36t3.5 36t3.5 28h-135 v-128zM640 564h158q20 70 50 128h-208v-128zM640 820h293q65 78 136 128h-429v-128zM640 1076h1024v128h-1024v-128zM640 1332h1024v128h-1024v-128zM896 372q0 -117 45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5t-45.5 223.5 t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5q0 -132 -93.5 -226t-226.5 -94t-226.5 94t-93.5 226zM1408 372q0 -26 19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19 h-64v64q0 26 -19 45t-45 19t-45 -19t-19 -45v-128z" />
+<glyph unicode="&#xf05d;" d="M128 -76q0 -53 37.5 -90.5t90.5 -37.5h1536q53 0 90.5 37.5t37.5 90.5v1664q0 53 -37.5 90.5t-90.5 37.5h-256v-256h128v-1408h-1280v1408h128v256h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-1664zM512 180h1024v1152h-128q0 -53 -37.5 -90.5t-90.5 -37.5h-512 q-53 0 -90.5 37.5t-37.5 90.5h-128v-1152zM640 1460q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5t37.5 90.5v256h-256v128h-256v-128h-256v-256zM896 1460v128h256v-128h-256z" />
+<glyph unicode="&#xf05e;" d="M128 -76v1664q0 53 37.5 90.5t90.5 37.5h256v-256h-128v-1408h1280v1408h-128v256h256q53 0 90.5 -37.5t37.5 -90.5v-1664q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM512 180v1152h128q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5 t37.5 90.5h128v-1152h-1024zM640 436h640v128h-640v-128zM640 692h512v128h-512v-128zM640 948h768v128h-768v-128zM640 1460v256h256v128h256v-128h256v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5zM896 1460h256v128h-256v-128z" />
+<glyph unicode="&#xf060;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 692h128v128h-128v-128zM512 1204h128v128h-128v-128zM640 820h128v128h-128v-128zM640 1076h128v128h-128v-128zM768 948h128v128h-128v-128zM896 692h384v128h-384v-128z" />
+<glyph unicode="&#xf061;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 820q0 -53 37.5 -90.5t90.5 -37.5v-128q0 -159 112.5 -271.5t271.5 -112.5v256q-53 0 -90.5 37.5t-37.5 90.5v128q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5v128q0 53 37.5 90.5t90.5 37.5 v256q-159 0 -271.5 -112.5t-112.5 -271.5v-128q-53 0 -90.5 -37.5t-37.5 -90.5zM1152 180q159 0 271.5 112.5t112.5 271.5v128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v128q0 159 -112.5 271.5t-271.5 112.5v-256q53 0 90.5 -37.5t37.5 -90.5v-128q53 0 90.5 -37.5 t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5v-256z" />
+<glyph unicode="&#xf062;" d="M0 820q0 -106 75 -181t181 -75q54 0 91 -38.5t37 -89.5v-256q0 -159 112.5 -271.5t271.5 -112.5v256q-53 0 -90.5 37.5t-37.5 90.5v256q0 159 -112.5 271.5t-271.5 112.5q159 0 271.5 112.5t112.5 271.5v256q0 54 38.5 91t89.5 37v256q-159 0 -271.5 -112.5 t-112.5 -271.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5q-106 0 -181 -75t-75 -181zM896 820q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1280 52v-256q159 0 271.5 112.5t112.5 271.5v256q0 54 38.5 91t89.5 37 q106 0 181 75t75 181t-75 181t-181 75q-53 0 -90.5 37.5t-37.5 90.5v256q0 159 -112.5 271.5t-271.5 112.5v-256q53 0 90.5 -37.5t37.5 -90.5v-256q0 -159 112.5 -271.5t271.5 -112.5q-159 0 -271.5 -112.5t-112.5 -271.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5z" />
+<glyph unicode="&#xf063;" d="M128 820q0 -106 75 -181t181 -75q54 0 91 -38.5t37 -89.5v-256q0 -159 112.5 -271.5t271.5 -112.5v256q-53 0 -90.5 37.5t-37.5 90.5v256q0 159 -112.5 271.5t-271.5 112.5q159 0 271.5 112.5t112.5 271.5v256q0 54 38.5 91t89.5 37v256q-159 0 -271.5 -112.5 t-112.5 -271.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5q-106 0 -181 -75t-75 -181zM1152 52v-256q159 0 271.5 112.5t112.5 271.5v256q0 54 38.5 91t89.5 37q106 0 181 75t75 181t-75 181t-181 75q-53 0 -90.5 37.5t-37.5 90.5v256q0 159 -112.5 271.5t-271.5 112.5v-256 q53 0 90.5 -37.5t37.5 -90.5v-256q0 -159 112.5 -271.5t271.5 -112.5q-159 0 -271.5 -112.5t-112.5 -271.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5z" />
+<glyph unicode="&#xf064;" d="M384 -204h512v256h-256v1536h256v256h-512v-2048zM1152 52v-256h512v2048h-512v-256h256v-1536h-256z" />
+<glyph unicode="&#xf065;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v128h512v-128q0 -160 114.5 -272t269.5 -112q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5h-128v512h128q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5 t-112.5 -271.5q0 -64 24 -128h-559q23 66 23 128q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5h128v-512h-128q-160 0 -272 -114.5t-112 -269.5zM256 180q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM256 1460q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM768 564v512h512v-512h-512zM1536 180q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5zM1536 1460q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf066;" d="M512 820q0 -104 39.5 -197.5t110.5 -164.5t164.5 -110.5t197.5 -39.5q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5h-256q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5q0 128 -79 231q96 71 151.5 178.5t55.5 230.5 q0 104 -39.5 197.5t-110.5 164.5t-164.5 110.5t-197.5 39.5q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5h256q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5q0 -126 79 -231q-96 -71 -151.5 -178.5t-55.5 -230.5zM768 820 q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf067;" d="M0 820q0 -159 78.5 -293.5t213 -213t293.5 -78.5q97 0 198 36q-95 117 -146 262q-34 -6 -52 -6q-121 0 -206.5 86t-85.5 207t85.5 207t206.5 86t207 -85.5t86 -207.5q0 -159 78.5 -293.5t213 -213t293.5 -78.5t293.5 78.5t213 213t78.5 293.5t-78.5 293.5t-213 213 t-293.5 78.5q-97 0 -198 -36q95 -117 146 -262q34 6 52 6q121 0 206.5 -86t85.5 -207q0 -122 -86.5 -207.5t-205.5 -85.5q-121 0 -207 85.5t-86 207.5q0 159 -78.5 293.5t-213 213t-293.5 78.5t-293.5 -78.5t-213 -213t-78.5 -293.5z" />
+<glyph unicode="&#xf068;" d="M0 820q0 -61 42.5 -103.5t103.5 -42.5t104 42.5t43 103.5q0 121 85.5 207t206.5 86t207 -85.5t86 -207.5q0 -159 78.5 -293.5t213 -213t293.5 -78.5t293.5 78.5t213 213t78.5 293.5q0 61 -42.5 103.5t-103.5 42.5t-104 -42.5t-43 -103.5q0 -121 -85.5 -207t-206.5 -86 t-207 85.5t-86 207.5q0 159 -78.5 293.5t-213 213t-293.5 78.5t-293.5 -78.5t-213 -213t-78.5 -293.5z" />
+<glyph unicode="&#xf069;" d="M128 692q0 -182 71 -348t191 -286t286 -191t348 -71t348 71t286 191t191 286t71 348q0 263 -140.5 479t-371.5 326v-296q119 -89 187.5 -222t68.5 -287q0 -174 -85.5 -321t-233 -233t-321.5 -86q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5q0 154 68.5 287 t187.5 222v296q-231 -110 -371.5 -326t-140.5 -479zM896 948q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-768z" />
+<glyph unicode="&#xf06a;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h128v768q-53 0 -90.5 37.5t-37.5 90.5v1152q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM640 -204h768v768q-53 0 -90.5 37.5t-37.5 90.5v1152h-512v-1152q0 -53 -37.5 -90.5t-90.5 -37.5v-768zM1536 -204h128q159 0 271.5 112.5 t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5v-1152q0 -53 -37.5 -90.5t-90.5 -37.5v-768z" />
+<glyph unicode="&#xf06b;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 948q0 -53 37.5 -90.5t90.5 -37.5v-576q0 -26 19 -45t45 -19t45 19t19 45v576q53 0 90.5 37.5t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5v192q0 26 -19 45t-45 19t-45 -19t-19 -45v-192 q-53 0 -90.5 -37.5t-37.5 -90.5v-128zM1152 564q0 -53 37.5 -90.5t90.5 -37.5v-192q0 -26 19 -45t45 -19t45 19t19 45v192q53 0 90.5 37.5t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5v576q0 26 -19 45t-45 19t-45 -19t-19 -45v-576q-53 0 -90.5 -37.5t-37.5 -90.5v-128z" />
+<glyph unicode="&#xf06c;" d="M0 382q0 -159 78.5 -293.5t213 -213t293.5 -78.5t293.5 78.5t213 213t78.5 293.5v878q0 121 86 206.5t207 84.5q121 0 206.5 -85.5t85.5 -206.5v-1316q0 -61 43 -103.5t104 -42.5t103.5 42.5t42.5 103.5v1317q0 159 -78.5 293.5t-213 213t-293.5 78.5t-293.5 -78.5 t-213 -213t-78.5 -293.5v-878q0 -121 -86 -206.5t-207 -85.5t-206.5 85.5t-85.5 206.5v1317q0 61 -43 103.5t-104 42.5t-103.5 -43t-42.5 -103v-1317z" />
+<glyph unicode="&#xf06d;" d="M0 52v-256q159 0 271.5 112.5t112.5 271.5v1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-1280q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-1280q0 -159 112.5 -271.5t271.5 -112.5v256 q-53 0 -90.5 37.5t-37.5 90.5v1280q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v1280q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5v-1280q0 -54 -38.5 -91t-89.5 -37z" />
+<glyph unicode="&#xf06e;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5t-81 -398.5t-218 -326.5t-326.5 -218t-398.5 -81q-208 0 -397.5 81t-327 218t-218.5 327t-81 398zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM384 820q0 130 51 248.5t136.5 204t204 136.5t248.5 51v-128q-212 0 -362 -150t-150 -362h-128zM640 820q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5 t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM896 820q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1024 180v128q212 0 362 150t150 362h128q0 -174 -85.5 -321t-233 -233t-321.5 -86z" />
+<glyph unicode="&#xf070;" d="M0 820q0 -208 81 -398t218.5 -327t327 -218t397.5 -81q209 0 398.5 81t326.5 218t218 326.5t81 398.5t-81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM457.5 597.5q-13.5 -51.5 12.5 -97.5t77 -59.5t98 12.5q46 27 59.5 78t-12.5 97q-27 46 -78 59.5t-97 -12.5t-59.5 -77.5zM768 820q0 -106 75 -181t181 -75t181 75 t75 181t-75 181t-181 75t-181 -75t-75 -181zM896 820q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM896 1332q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M1343.5 531q13.5 -51 59.5 -78q47 -26 98 -12.5t77 59.5q27 46 13 97.5t-60 77.5t-97 12.5t-77 -59.5q-27 -46 -13.5 -97z" />
+<glyph unicode="&#xf071;" d="M0 436q0 -159 112.5 -271.5t271.5 -112.5h128q0 106 75 181t181 75h512q106 0 181 -75t75 -181h128q159 0 271.5 112.5t112.5 271.5v768q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-768zM256 180v128h128v-128h-128zM256 564v640 q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 756q0 -80 56 -136t136 -56t136 56t56 136t-56 136t-136 56t-136 -56t-56 -136zM384 1076h1280v128h-1280v-128zM652 52h744 q-20 57 -69 92.5t-111 35.5h-384q-61 0 -110.5 -36t-69.5 -92zM896 692h256v128h-256v-128zM1280 756q0 -80 56 -136t136 -56t136 56t56 136t-56 136t-136 56t-136 -56t-56 -136zM1664 180v128h128v-128h-128z" />
+<glyph unicode="&#xf072;" d="M0 820q0 -188 133.5 -318t314.5 -130h1152q186 0 317 131.5t131 316.5t-131 316.5t-317 131.5q-185 0 -316.5 -131.5t-131.5 -316.5q0 -99 45 -192h-346q45 93 45 192q0 185 -131 316.5t-317 131.5q-185 0 -316.5 -131.5t-131.5 -316.5zM256 820q0 80 56 136t136 56 t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM1408 820q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
+<glyph unicode="&#xf073;" d="M256 564q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103t279.5 279.5t103 385.5q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -212 -150 -362t-362 -150t-362 150t-150 362q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM640 564 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v128h-192q-26 0 -45 19t-19 45t19 45t45 19h192v128h-192q-26 0 -45 19t-19 45t19 45t45 19h192v128h-192q-26 0 -45 19t-19 45t19 45t45 19h192v128h-192q-26 0 -45 19t-19 45t19 45t45 19h169 q-40 113 -138.5 184.5t-222.5 71.5q-123 0 -221.5 -71t-138.5 -185h168q26 0 45 -19t19 -45t-19 -45t-45 -19h-192v-128h192q26 0 45 -19t19 -45t-19 -45t-45 -19h-192v-128h192q26 0 45 -19t19 -45t-19 -45t-45 -19h-192v-128h192q26 0 45 -19t19 -45t-19 -45t-45 -19h-192 v-128z" />
+<glyph unicode="&#xf074;" d="M439 674q0 -141 81.5 -253.5t210.5 -158.5v192q0 31 21.5 52t52.5 21q30 0 51.5 -21t21.5 -52v-512q0 -61 42.5 -103.5t103.5 -42.5t103.5 42.5t42.5 103.5v512q0 31 21.5 52t51.5 21q31 0 52.5 -21t21.5 -52v-192q129 46 210.5 158.5t81.5 253.5h-366q-30 0 -51.5 21 t-21.5 52q0 30 21.5 51.5t51.5 21.5h366v146h-219q-31 0 -52 21.5t-21 51.5t21 51.5t52 22.5h219v146h-366q-30 0 -51.5 21t-21.5 52q0 30 21.5 51.5t51.5 21.5h366q0 141 -81.5 253.5t-210.5 158.5v-193q0 -30 -21.5 -51.5t-52.5 -21.5q-30 0 -51.5 21.5t-21.5 52.5v219 h-292v-219q0 -31 -21.5 -52.5t-51.5 -21.5q-31 0 -52.5 21.5t-21.5 52.5v192q-129 -46 -210.5 -158.5t-81.5 -253.5h366q30 0 51.5 -21.5t21.5 -51.5t-21.5 -51.5t-51.5 -21.5h-366v-146h219q31 0 52 -21.5t21 -52.5q0 -30 -21 -51.5t-52 -21.5h-219v-146h366 q30 0 51.5 -21.5t21.5 -51.5q0 -31 -21.5 -52t-51.5 -21h-366zM878 1039q0 31 21.5 52.5t51.5 21.5l146 -1q31 0 52 -21.5t21 -51.5t-21 -51.5t-52 -21.5h-146q-30 0 -51.5 21.5t-21.5 51.5z" />
+<glyph unicode="&#xf075;" d="M0 1076q0 53 37.5 90.5t90.5 37.5q0 159 112.5 271.5t271.5 112.5h384l768 256q104 0 192.5 -103t140 -279.5t51.5 -385.5t-51.5 -385.5t-140 -279.5t-192.5 -103l-768 256h-32l-96 -640q0 -53 -37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5t-37.5 90.5l104 672 q-104 45 -168 140t-64 212q-53 0 -90.5 37.5t-37.5 90.5zM384 1076h128v256h-128v-256zM640 1076h128v256h-128v-256zM1408 1076q0 -139 34.5 -257t93.5 -186.5t128 -68.5t128 68.5t93.5 186.5t34.5 257t-34.5 257t-93.5 186.5t-128 68.5t-128 -68.5t-93.5 -186.5 t-34.5 -257zM1548 948q-23 128 0 256h116q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-116z" />
+<glyph unicode="&#xf076;" d="M0 1076q0 159 112.5 271.5t271.5 112.5l384 1q11 0 31 1.5t82.5 10t125 22.5t151.5 43t170 68t171.5 101t164.5 138q104 0 192.5 -103t140 -279.5t51.5 -385.5t-51.5 -385.5t-140 -279.5t-192.5 -103q-249 255 -647 347q-12 -41 -45 -66.5t-76 -25.5h-26l-102 -512 q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5t-37.5 90.5l128 640q-55 0 -91.5 39.5t-36.5 88.5q-159 0 -271.5 112.5t-112.5 271.5zM256 949h128v256h-128v-256zM1408 1077q0 -139 34.5 -257t93.5 -186.5t128 -68.5t128 68.5t93.5 186.5 t34.5 257t-34.5 257t-93.5 186.5t-128 68.5t-128 -68.5t-93.5 -186.5t-34.5 -257zM1548 949q-23 128 0 256h116q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-116z" />
+<glyph unicode="&#xf077;" d="M0 820q0 -53 37.5 -90.5t90.5 -37.5q5 0 12.5 2t9.5 2q29 -83 90.5 -145.5t143.5 -91.5v-151q0 -106 75 -181t181 -75q0 -53 37.5 -90.5t90.5 -37.5h128q53 0 90.5 37.5t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5q-53 0 -90.5 37.5 t-37.5 90.5v1024h128q0 53 37.5 90.5t90.5 37.5h512q53 0 90.5 -37.5t37.5 -90.5h128v-896q125 0 223.5 72.5t138.5 187.5q2 0 9.5 -2t12.5 -2q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5q-5 0 -12 -2t-9 -2q-28 82 -90 144.5t-145 92.5v151q0 159 -112.5 271.5 t-271.5 112.5h-512q-159 0 -271.5 -112.5t-112.5 -271.5v-151q-83 -30 -145 -92.5t-90 -144.5q-2 0 -9 2t-12 2q-53 0 -90.5 -37.5t-37.5 -90.5zM256 692v256h128v-256h-128zM1664 692v256h128v-256h-128z" />
+<glyph unicode="&#xf078;" d="M0 52v1280q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 37.5t37.5 90.5t37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5t37.5 -90.5t90.5 -37.5h256q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1792q-53 0 -90.5 37.5t-37.5 90.5zM384 820 q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q174 0 321.5 86t233 233t85.5 321t-85.5 321t-233 233t-321.5 86q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM640 820q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5 t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
+<glyph unicode="&#xf079;" d="M0 52q0 -53 37.5 -90.5t90.5 -37.5h1792q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-384v128q0 53 -37.5 90.5t-90.5 37.5h-768q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM256 180v1024h512v256h512v-256h512 v-1024h-1536zM384 1012q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM640 692q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM768 692q0 106 75 181t181 75t181 -75t75 -181 t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf07a;" d="M0 -76q0 -53 37.5 -90.5t90.5 -37.5h1792q53 0 90.5 37.5t37.5 90.5v1408q0 53 -37.5 90.5t-90.5 37.5h-512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256h-256v128h-128v-128h-128q-53 0 -90.5 -37.5t-37.5 -90.5v-1408zM256 52v640h408 q-24 -64 -24 -128q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5q0 62 -23 128h407v-640h-1536zM256 820v384h1536v-384h-484q-76 84 -181 113.5t-209 -0.5t-178 -113h-484zM384 948h128v128h-128v-128zM640 948h128v128h-128v-128zM768 564q0 106 75 181 t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM896 1460v128h256v-128h-256zM1408 948h256v128h-256v-128z" />
+<glyph unicode="&#xf07b;" d="M256 1076q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -87 -42.5 -204t-110 -235.5t-149.5 -241.5t-164 -229t-149.5 -190t-110.5 -132l-42 -48q-16 18 -43.5 49.5t-107.5 129t-152.5 193t-161 226t-152.5 244.5t-107.5 232.5 t-43.5 205.5zM512 1076q0 -212 150 -362t362 -150t362 150t150 362t-150 362t-362 150t-362 -150t-150 -362z" />
+<glyph unicode="&#xf07c;" d="M256 1076q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -87 -42.5 -204t-110 -235.5t-149.5 -241.5t-164 -229t-149.5 -190t-110.5 -132l-42 -48q-16 18 -43.5 49.5t-107.5 129t-152.5 193t-161 226t-152.5 244.5t-107.5 232.5 t-43.5 205.5zM512 1076q0 -212 150 -362t362 -150t362 150t150 362t-150 362t-362 150t-362 -150t-150 -362zM768 1076q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf07d;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-71q117 -131 165 -299q34 -37 34 -85v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v1280q0 48 34 85q48 168 165 299 h-71q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM512 1332q0 -79 52.5 -213.5t128 -270.5t151 -260t128.5 -202l52 -78q21 30 55.5 81.5t122.5 195t155.5 267.5t123 262.5t55.5 217.5q0 212 -150 362t-362 150t-362 -150t-150 -362zM768 1332q0 106 75 181t181 75t181 -75 t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf07e;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 180h128v128h-128v-128zM384 436h128v128h-128v-128zM384 1204h128v128h-128v-128zM512 308h128v128h-128v-128zM512 948h128v128h-128v-128zM640 180h128v128h-128v-128zM640 436h128v128h-128v-128 zM640 1332h128v128h-128v-128zM768 820h128v128h-128v-128zM896 308h128v128h-128v-128zM1024 820h128v128h-128v-128zM1152 308h128v128h-128v-128zM1152 1076h128v128h-128v-128zM1408 436h128v128h-128v-128zM1408 948h128v128h-128v-128zM1536 692h128v128h-128v-128z " />
+<glyph unicode="&#xf080;" d="M0 180q0 -53 37.5 -90.5t90.5 -37.5h384v128h-64q-26 0 -45 19t-19 45t19 45t45 19h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-128h768v128h-64q-26 0 -45 19t-19 45t19 45t45 19h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-128h384q53 0 90.5 37.5t37.5 90.5 v1280q0 53 -37.5 90.5t-90.5 37.5h-1792q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM256 436v896h896v-896h-896zM450 564h509q-72 95 -191 120v21q57 21 92.5 69.5t35.5 109.5v128q0 80 -56 136t-136 56t-136 -56t-56 -136v-128q0 -61 35.5 -109.5t92.5 -69.5v-21 q-118 -25 -190 -120zM1280 436v128h128v-128h-128zM1280 692v128h640v-128h-640zM1280 948v128h256v-128h-256zM1280 1204v128h384v-128h-384zM1664 948v128h256v-128h-256zM1792 1204v128h128v-128h-128z" />
+<glyph unicode="&#xf081;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM640 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19 t-19 -45v-512zM896 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM1152 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM1408 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19 t-45 -19t-19 -45v-512z" />
+<glyph unicode="&#xf082;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM640 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19 t-19 -45v-512zM896 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM1152 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512z" />
+<glyph unicode="&#xf083;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM640 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19 t-19 -45v-512zM896 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512z" />
+<glyph unicode="&#xf084;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM640 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19 t-19 -45v-512z" />
+<glyph unicode="&#xf085;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512z" />
+<glyph unicode="&#xf086;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf087;" d="M0 244q0 -53 37.5 -90.5t90.5 -37.5h1664q53 0 90.5 37.5t37.5 90.5v256q53 0 90.5 37.5t37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-1664q-53 0 -90.5 -37.5t-37.5 -90.5v-1152zM256 500v640q0 53 37.5 90.5t90.5 37.5h1152 q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 756h384v128h-384v-128zM896 756h128v-128h128v-128h256v128h128v128h-128v128h128v128h-128v128h-256v-128h-128v-128h-128v-128z" />
+<glyph unicode="&#xf088;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h1152q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h1152q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564h128v512h-128v-512zM640 564h128v512h-128v-512zM896 564h128v512h-128v-512zM1152 564h128v512h-128v-512zM1408 564h128v512h-128v-512z" />
+<glyph unicode="&#xf089;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h1152q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h1152q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564h128v512h-128v-512zM640 564h128v512h-128v-512zM896 564h128v512h-128v-512zM1152 564h128v512h-128v-512z" />
+<glyph unicode="&#xf08a;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h1152q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h1152q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564h128v512h-128v-512zM640 564h128v512h-128v-512zM896 564h128v512h-128v-512z" />
+<glyph unicode="&#xf08b;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h1152q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h1152q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564h128v512h-128v-512zM640 564h128v512h-128v-512z" />
+<glyph unicode="&#xf08c;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h1152q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h1152q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5zM384 564h128v512h-128v-512z" />
+<glyph unicode="&#xf08d;" d="M0 564q0 -159 112.5 -271.5t271.5 -112.5h1152q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 564v512q0 53 37.5 90.5t90.5 37.5h1152q53 0 90.5 -37.5t37.5 -90.5v-512 q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf08e;" d="M0 568q0 -159 112.5 -271.5t271.5 -112.5h527l-28 -130l95 130h558q159 0 271.5 112.5t112.5 271.5h128v512h-128q0 159 -112.5 271.5t-271.5 112.5h-409l25 122l-90 -122h-678q-159 0 -271.5 -112.5t-112.5 -271.5v-512zM256 568v512q0 53 37.5 90.5t90.5 37.5h491 l-373 -508h521l-56 -260h-583q-53 0 -90.5 37.5t-37.5 90.5zM1023 953l52 255h461q53 0 90.5 -37.5t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-370l376 513h-519z" />
+<glyph unicode="&#xf090;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM896 820v384q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-256h256q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-384q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf091;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM270 960q33 177 139.5 320t268 225.5t346.5 82.5q251 0 449 -147 t276 -379q-29 -89 -91 -151q-74 -74 -173 -100t-197.5 0t-172.5 100q-113 113 -264 158.5t-304 16.5t-277 -126zM299 578q29 89 92 152q112 112 271.5 112t271.5 -112q113 -113 263.5 -158.5t303.5 -17t277 125.5q-33 -177 -139.5 -320t-268 -225.5t-346.5 -82.5 q-251 0 -449 147t-276 379z" />
+<glyph unicode="&#xf092;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5q0 -126 -47 -256h-1442q-47 134 -47 256zM455 308h1138q-108 -120 -255.5 -188t-313.5 -68t-313.5 68t-255.5 188z" />
+<glyph unicode="&#xf093;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 242 143 444l1069 -1069q-202 -143 -444 -143 q-209 0 -385.5 103t-279.5 279.5t-103 385.5zM580 1445q202 143 444 143q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -242 -143 -444z" />
+<glyph unicode="&#xf094;" d="M0 1011q0 169 66 323.5t177.5 266t266 177.5t323.5 66q170 0 324.5 -66t266 -177.5t177.5 -266t66 -323.5q0 -231 -126 -436l451 -451q56 -56 56 -136t-56 -136t-136 -56t-136 56l-451 451q-205 -126 -436 -126q-169 0 -323.5 66t-266 177.5t-177.5 266t-66 324.5z M256 1011q0 -157 77.5 -290t210.5 -210t289 -77q118 0 224.5 45.5t184 123t123 184t45.5 224.5t-45.5 224.5t-123 184t-184 123t-224.5 45.5q-156 0 -289 -77.5t-210.5 -210.5t-77.5 -289z" />
+<glyph unicode="&#xf095;" d="M0 1011q0 -170 66 -324.5t177.5 -266t266 -177.5t323.5 -66q231 0 436 126l451 -451q56 -56 136 -56t136 56t56 136t-56 136l-451 451q126 205 126 436q0 169 -66 323.5t-177.5 266t-266 177.5t-324.5 66q-169 0 -323.5 -66t-266 -177.5t-177.5 -266t-66 -323.5z M256 1011q0 156 77.5 289t210.5 211t289 78q118 0 224.5 -46t184 -123.5t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5q-156 0 -289 77t-210.5 210t-77.5 290zM513 947h256v-256h129v256h256v129h-256v256h-129v-256h-256v-129z" />
+<glyph unicode="&#xf096;" d="M0 1011q0 -170 66 -324.5t177.5 -266t266 -177.5t323.5 -66q231 0 436 126l451 -451q56 -56 136 -56t136 56t56 136t-56 136l-451 451q126 205 126 436q0 169 -66 323.5t-177.5 266t-266 177.5t-324.5 66q-169 0 -323.5 -66t-266 -177.5t-177.5 -266t-66 -323.5z M256 1011q0 156 77.5 289t210.5 211t289 78q118 0 224.5 -46t184 -123.5t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5q-156 0 -289 77t-210.5 210t-77.5 290zM513 947h641v129h-641v-129z" />
+<glyph unicode="&#xf097;" d="M0 946q0 -182 71 -348.5t191.5 -286.5t286.5 -191t349 -71q261 0 482 143l340 -340q56 -56 136 -56t136 56t56 136t-56 136l-340 340q143 221 143 482q0 183 -71 349t-191 286.5t-286.5 191.5t-348.5 71q-183 0 -349 -71t-286.5 -191.5t-191.5 -286.5t-71 -349zM256 946 q0 175 86 322.5t233.5 233.5t322.5 86q174 0 321.5 -86t233.5 -233.5t86 -322.5q0 -174 -86 -321.5t-233.5 -233.5t-321.5 -86q-175 0 -322.5 86t-233.5 233.5t-86 321.5z" />
+<glyph unicode="&#xf098;" d="M0 946q0 -182 71 -348.5t191.5 -286.5t286.5 -191t349 -71q261 0 482 143l340 -340q56 -56 136 -56t136 56t56 136t-56 136l-340 340q143 221 143 482q0 183 -71 349t-191 286.5t-286.5 191.5t-348.5 71q-183 0 -349 -71t-286.5 -191.5t-191.5 -286.5t-71 -349zM256 946 q0 175 86 322.5t233.5 233.5t322.5 86q174 0 321.5 -86t233.5 -233.5t86 -322.5q0 -174 -86 -321.5t-233.5 -233.5t-321.5 -86q-175 0 -322.5 86t-233.5 233.5t-86 321.5zM513 946q0 -53 37.5 -90.5t90.5 -37.5h128v-128q0 -53 38 -90.5t91 -37.5t90.5 37.5t37.5 90.5v128 h128q53 0 90.5 37.5t37.5 90.5t-37.5 91t-90.5 38h-128v128q0 53 -37.5 90.5t-90.5 37.5t-91 -37.5t-38 -90.5v-128h-128q-53 0 -90.5 -38t-37.5 -91z" />
+<glyph unicode="&#xf099;" d="M0 946q0 -182 71 -348.5t191.5 -286.5t286.5 -191t349 -71q261 0 482 143l340 -340q56 -56 136 -56t136 56t56 136t-56 136l-340 340q143 221 143 482q0 183 -71 349t-191 286.5t-286.5 191.5t-348.5 71q-183 0 -349 -71t-286.5 -191.5t-191.5 -286.5t-71 -349zM256 946 q0 175 86 322.5t233.5 233.5t322.5 86q174 0 321.5 -86t233.5 -233.5t86 -322.5q0 -174 -86 -321.5t-233.5 -233.5t-321.5 -86q-175 0 -322.5 86t-233.5 233.5t-86 321.5zM513 946q0 -53 37.5 -90.5t90.5 -37.5h513q53 0 90.5 37.5t37.5 90.5t-37.5 91t-90.5 38h-513 q-53 0 -90.5 -38t-37.5 -91z" />
+<glyph unicode="&#xf09a;" d="M0 820q3 -8 9.5 -22.5t31 -58t54 -86t79.5 -100t106.5 -107t136.5 -100t168 -86t202 -58t237 -22.5t237 22t202.5 59t167.5 85t136.5 101t106 106t80 101t53.5 85t31 59l10 22q-3 8 -9.5 22.5t-31 58t-54 86t-79.5 100t-106.5 107t-136.5 100t-168 86t-202 58t-237 22.5 t-237 -22t-202.5 -59t-167.5 -85t-136.5 -101t-106 -106t-80 -101t-53.5 -85t-31 -59zM640 820q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM768 820q0 -106 75 -181t181 -75t181 75t75 181t-75 181 t-181 75t-181 -75l181 -181h-256z" />
+<glyph unicode="&#xf09b;" d="M0 820q4 -11 12 -31t37.5 -81.5t62.5 -120.5t87.5 -140t113 -150t138.5 -140t164.5 -120.5t191 -81t217.5 -31.5q141 0 274 49.5t232.5 128.5t186.5 174.5t146.5 191t102 174.5t62.5 128l20 50q-4 11 -12 31t-37.5 81.5t-62.5 120.5t-87.5 140t-113 150t-138.5 140 t-164.5 120.5t-191 81t-217.5 31.5q-141 0 -274 -49.5t-232.5 -128.5t-186.5 -174.5t-146.5 -191t-102 -174.5t-62.5 -128zM384 820q0 174 86 321.5t233 233t321 85.5q130 0 248.5 -50.5t204.5 -136.5t136.5 -204.5t50.5 -248.5q0 -174 -85.5 -321t-233 -233t-321.5 -86 q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM640 820q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5q-62 0 -128 -23v-233h-232q-24 -64 -24 -128z" />
+<glyph unicode="&#xf09c;" d="M559 693l186 -186q115 115 279 115t279 -115l186 186q-126 126 -295.5 171t-339 0t-295.5 -171zM761 228q0 -109 77 -186.5t186 -77.5t186 77.5t77 186.5t-77 186t-186 77t-186 -77t-77 -186z" />
+<glyph unicode="&#xf09d;" d="M279 972l187 -186q151 152 354.5 206t407 0t354.5 -206l187 186q-152 152 -349 231t-396 79t-396 -79t-349 -231zM559 693l186 -186q115 115 279 115t279 -115l186 186q-126 126 -295.5 171t-339 0t-295.5 -171zM761 228q0 -109 77 -186.5t186 -77.5t186 77.5t77 186.5 t-77 186t-186 77t-186 -77t-77 -186z" />
+<glyph unicode="&#xf09e;" d="M0 1252l186 -187q171 171 392.5 259.5t445.5 88.5t445.5 -88.5t392.5 -259.5l186 187q-167 167 -375 271.5t-428.5 135.5t-441 0t-428.5 -135.5t-375 -271.5zM279 972l187 -186q151 152 354.5 206t407 0t354.5 -206l187 186q-152 152 -349 231t-396 79t-396 -79 t-349 -231zM559 693l186 -186q115 115 279 115t279 -115l186 186q-126 126 -295.5 171t-339 0t-295.5 -171zM761 229q0 -109 77 -186.5t186 -77.5t186 77t77 186t-77 186t-186 78q-109 0 -186 -77t-77 -186z" />
+<glyph unicode="&#xf0a0;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-768v-459l302 -302l98 99q29 29 71.5 35t79 -8.5t63 -46t26.5 -70.5v-362q0 -55 -50.5 -110.5t-99.5 -55.5h-362q-40 0 -72 27.5t-45.5 66t-7.5 81.5t35 72l86 88l-305 305h-459v-768zM256 1332q0 -53 37.5 -90.5t90.5 -37.5h128q53 0 90.5 37.5t37.5 90.5v128 q0 53 -37.5 90.5t-90.5 37.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5v-128z" />
+<glyph unicode="&#xf0a1;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1231l-246 246l-98 -96q-29 -29 -72.5 -34.5t-81.5 8.5 t-65.5 46t-27.5 71v362q0 52 58 108.5t108 56.5h362q40 0 72 -29t45.5 -69t7.5 -84.5t-35 -73.5l-90 -87l240 -240v1223q0 53 -37.5 90.5t-90.5 37.5h-768v-256q0 -159 -112.5 -271.5t-271.5 -112.5h-256v-768zM256 1332q0 -53 37.5 -90.5t90.5 -37.5h128q53 0 90.5 37.5 t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5v-128z" />
+<glyph unicode="&#xf0a2;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 308q0 -53 37.5 -90.5t90.5 -37.5h384l-512 512v-384zM384 948l512 512h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-384zM1152 180h384q53 0 90.5 37.5t37.5 90.5v384zM1152 1460l512 -512v384 q0 53 -37.5 90.5t-90.5 37.5h-384z" />
+<glyph unicode="&#xf0a3;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 692l512 -512v384q0 53 -37.5 90.5t-90.5 37.5h-384zM384 948h384q53 0 90.5 37.5t37.5 90.5v384zM1152 180l512 512h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-384zM1152 1076q0 -53 37.5 -90.5 t90.5 -37.5h384l-512 512v-384z" />
+<glyph unicode="&#xf0a4;" d="M0 -75v384q0 41 23 72.5t55.5 45.5t71.5 8t69 -35l101 -102l358 358q24 24 53 33t54.5 3t49.5 -20.5t38.5 -38.5t21 -50t-2.5 -55t-33 -53l-358 -357l102 -102q30 -30 36 -69t-8.5 -72t-46.5 -55.5t-72 -22.5h-384q-53 0 -90.5 37.5t-37.5 90.5zM0 1332v384 q0 53 37.5 90.5t90.5 37.5h384q42 0 74 -23.5t45 -56.5t6.5 -71.5t-34.5 -66.5l-102 -102l358 -356q24 -24 33 -53t2.5 -55t-21 -50t-38.5 -38.5t-49.5 -21t-54.5 2.5t-53 33l-358 358l-101 -102q-30 -30 -69 -36t-71.5 8t-55.5 45.5t-23 72.5zM1154 1059.5q-6 25.5 3 54.5 t33 53l357 358l-101 101q-30 30 -36 69t8 72t46 55.5t72 22.5h384q53 0 90.5 -37.5t37.5 -90.5v-384q0 -41 -23 -72.5t-55.5 -45.5t-71.5 -8t-68 36l-102 101l-357 -357q-24 -24 -53 -33t-55 -3t-50 20.5t-38.5 38.5t-20.5 49.5zM1154.5 536q-7.5 34 3.5 63.5t34.5 53 t53 34.5t63.5 4t62 -35l357 -358l102 101q29 30 68 36t71.5 -8t55.5 -45.5t23 -72.5v-385q0 -53 -37.5 -90.5t-90.5 -37.5h-384q-42 0 -74 23.5t-45 56.5t-6.5 71.5t35.5 67.5l101 102l-357 357q-28 28 -35.5 62z" />
+<glyph unicode="&#xf0a5;" d="M0 -76v384q0 41 23 72.5t55.5 45.5t71.5 8t69 -35l101 -102l358 358q24 24 53 33t54.5 3t49.5 -20.5t38.5 -38.5t21 -50t-2.5 -55t-33 -53l-358 -357l102 -102q30 -30 36 -69t-8.5 -72t-46.5 -55.5t-72 -22.5h-384q-53 0 -90.5 37.5t-37.5 90.5zM1154 1058.5 q-6 25.5 3 54.5t33 53l357 358l-101 101q-30 30 -36 69t8 72t46 55.5t72 22.5h384q53 0 90.5 -37.5t37.5 -90.5v-384q0 -41 -23 -72.5t-55.5 -45.5t-71.5 -8t-68 36l-102 101l-357 -357q-24 -24 -53 -33t-55 -3t-50 20.5t-38.5 38.5t-20.5 49.5z" />
+<glyph unicode="&#xf0a6;" d="M0 -62.5q4 41.5 38 75.5l357 358l-101 101q-30 30 -36 69t8 72t46 55.5t72 22.5h384q53 0 90.5 -37.5t37.5 -90.5v-384q0 -41 -23 -72.5t-55.5 -45.5t-71.5 -8t-68 35l-102 102l-357 -359q-34 -33 -75.5 -37.5t-73.5 17t-53 53.5t-17 73.5zM2.5 1687q-7.5 34 3.5 63.5 t34.5 53t53 34.5t63.5 4t62 -35l357 -358l102 101q36 36 88 38t91 -33.5t39 -94.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5h-384q-42 0 -74 23.5t-45 56.5t-6.5 71.5t35.5 66.5l101 102l-357 357q-28 28 -35.5 62zM1152 179v384q0 53 37.5 90.5t90.5 37.5h384q42 0 74 -23.5 t45 -56.5t6.5 -71.5t-34.5 -67.5l-102 -101l358 -357q24 -24 33 -53t2.5 -55t-21 -50t-38.5 -38.5t-49.5 -21t-54.5 2.5t-53 33l-358 358l-101 -101q-36 -36 -88.5 -38t-91.5 33.5t-39 94.5zM1152 1075v384q0 46 24 78.5t58 43t72 3t65 -33.5l101 -102l358 358q24 24 53 33 t54.5 3t49.5 -20.5t38.5 -38.5t21 -50t-2.5 -55t-33 -53l-358 -357l102 -102q30 -30 36 -69t-8.5 -72t-46.5 -55.5t-72 -22.5h-384q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0a7;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM384 820v128h1280v-128h-1280zM384 1076v128h1280v-128h-1280zM384 1332v128h1280v-128h-1280zM642 542q-6 39 8 72t46 55.5t72 22.5h512q42 0 74 -23.5t45 -56.5t6.5 -71.5t-34.5 -66.5l-256 -256 q-37 -38 -90.5 -38t-90.5 38l-256 255q-30 30 -36 69z" />
+<glyph unicode="&#xf0a8;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM384 820v128h1280v-128h-1280zM384 1076v128h1280v-128h-1280zM384 1332v128h1280v-128h-1280zM642.5 332.5q6.5 38.5 35.5 66.5l256 256q37 37 90.5 37t90.5 -37l256 -256q30 -30 36 -69t-8.5 -72t-46.5 -55.5 t-72 -22.5l-512 1q-42 0 -74 23.5t-45 56.5t-6.5 71.5z" />
+<glyph unicode="&#xf0a9;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 308h1024v256h-1024v-256zM512 692h1024v256h-1024v-256zM512 1076h1024v256h-1024v-256z" />
+<glyph unicode="&#xf0aa;" d="M512 308h1024v256h-1024v-256zM512 692h1024v256h-1024v-256zM512 1076h1024v256h-1024v-256z" />
+<glyph unicode="&#xf0ab;" d="M0 1076v768h768q160 0 272 -112l896 -896q112 -112 112 -271.5t-112 -271.5l-384 -385q-112 -112 -271 -112t-272 112l-896 897q-113 113 -113 271zM256 1076q0 -52 38 -90l896 -896q38 -38 91 -38t90 38l384 384q37 38 37 91t-37 90l-896 896q-37 37 -91 37h-512v-512z M384 1332q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0ac;" d="M0 815l662 645h1002q159 0 271.5 -112.5t112.5 -271.5v-512q0 -159 -112.5 -271.5t-271.5 -112.5h-1002zM362 815l406 -379h896q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-896zM640 820q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0ad;" d="M0 1396v192q0 106 75 181t181 75h256q106 0 181 -75t75 -181h256q160 0 272 -112l640 -640q112 -112 112 -271.5t-112 -271.5l-384 -385q-112 -112 -271 -112t-272 112l-640 641q-113 113 -113 271v768h384q0 53 -37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5 t-37.5 -90.5v-192q0 -39 -32 -55t-64 0t-32 55zM512 820q0 -52 38 -90l640 -640q38 -38 91 -38t90 38l384 384q37 38 37 91t-37 90l-640 640q-37 37 -91 37h-65q65 -88 65 -192q0 -71 -24.5 -130.5t-64.5 -98.5t-93.5 -63t-109.5 -27.5t-114 13t-106 52.5v-66zM512 1140 q0 -51 21 -91t55 -61t75 -30.5t82 0t75 30.5t55 61t21 91q0 61 -36 110t-92 69v-179q0 -39 -32 -55t-64 0t-32 55v179q-56 -20 -92 -69t-36 -110z" />
+<glyph unicode="&#xf0ae;" d="M0 1396q0 -39 32 -55t64 0t32 55v192q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5h-384v-768q0 -158 113 -271l640 -641q113 -112 272 -112t271 112l384 385q112 112 112 271.5t-112 271.5l-640 640q-112 112 -272 112h-128v-448q0 -51 -21 -91t-55 -61 t-75 -30.5t-82 0t-75 30.5t-55 61t-21 91q0 61 36 110t92 69v-179q0 -39 32 -55t64 0t32 55v448q0 106 -76 181t-180 75h-256q-106 0 -181 -75t-75 -181v-192z" />
+<glyph unicode="&#xf0b0;" d="M0 820q0 179 69.5 341.5t187 280t280 187t341.5 69.5q178 0 340.5 -69.5t280 -187t187 -280t69.5 -341.5h147q47 0 83 -26.5t51.5 -64t8.5 -82t-40 -77.5l-292 -292q-43 -44 -103.5 -44t-103.5 44l-293 292q-33 33 -40 77.5t8.5 82t52 64t83.5 26.5h146 q0 159 -78.5 293.5t-213 213t-293.5 78.5t-293.5 -78.5t-213 -213t-78.5 -293.5t78.5 -293.5t213 -213t293.5 -78.5q111 0 215 42l220 -218q-202 -117 -435 -117q-179 0 -341.5 69.5t-280 187t-187 280t-69.5 341.5z" />
+<glyph unicode="&#xf0b1;" d="M0 437v512q0 159 112.5 271.5t271.5 112.5h512v127q0 42 23.5 74t56.5 45t71.5 6.5t67.5 -34.5l256 -256q38 -40 37.5 -92t-37.5 -89l-256 -256q-30 -30 -69 -36t-72 8t-55.5 46t-22.5 72v128h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-512q0 -53 37.5 -90.5t90.5 -37.5h1280 q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-23q45 128 0 256l23 1q159 0 271.5 -112.5t112.5 -271.5v-512q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5z" />
+<glyph unicode="&#xf0b2;" d="M2.5 716.5q6.5 38.5 34.5 67.5l256 255q40 39 92 38t89 -38l256 -256q30 -30 36 -69t-8 -72t-46 -55.5t-72 -22.5h-128v-128q0 -53 37.5 -90.5t90.5 -37.5l768 1q54 0 91 39q133 -65 275 -21q-37 -120 -137 -197t-229 -77h-768q-159 0 -271.5 112.5t-112.5 271.5v128 h-128q-42 0 -74 23.5t-45 56.5t-6.5 71.5zM274 1314q37 120 137 197t229 77h768q159 0 271.5 -112.5t112.5 -271.5v-128h128q42 0 74 -23.5t45 -56.5t6.5 -71.5t-35.5 -66.5l-256 -256q-40 -39 -91.5 -38.5t-89.5 37.5l-256 256q-30 30 -36 69t8.5 72t46.5 55.5t72 22.5h128 v128q0 53 -37.5 90.5t-90.5 37.5h-768q-54 0 -91 -39q-133 65 -275 21z" />
+<glyph unicode="&#xf0b3;" d="M0 308q0 -53 37.5 -90.5t90.5 -37.5h128q131 0 249.5 51t204 137t136 204.5t50.5 247.5q0 159 112.5 271.5t271.5 112.5h256v-128q0 -42 23.5 -74t56.5 -45t71.5 -6.5t67.5 34.5l256 256q38 40 37.5 92t-37.5 89l-256 256q-30 30 -69 36t-72 -8t-55.5 -46t-22.5 -72v-128 h-256q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5q0 -159 -112.5 -271.5t-271.5 -112.5h-128q-53 0 -90.5 -37.5t-37.5 -90.5zM0 1331q0 -53 37.5 -90.5t90.5 -37.5h128q89 0 166.5 -38.5t131.5 -106.5q44 132 127 236q-185 165 -425 165h-128q-53 0 -90.5 -37.5 t-37.5 -90.5zM855 344q183 -165 425 -165h256v-128q0 -42 23.5 -74t56.5 -45t71.5 -6.5t67.5 34.5l256 256q38 40 37.5 92t-37.5 89l-256 256q-30 30 -69 36t-72 -8t-55.5 -46t-22.5 -72v-128h-256q-89 0 -166.5 38.5t-131.5 105.5q-44 -132 -127 -235z" />
+<glyph unicode="&#xf0b4;" d="M0 437q1 52 38 89l256 256q30 30 68.5 36t71.5 -8t55.5 -46t22.5 -72v-128h1152q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-1024q-47 0 -79.5 26.5t-40 64t0 75t40 64t79.5 26.5h1024q159 0 271.5 -112.5t112.5 -271.5v-512q0 -159 -112.5 -271.5 t-271.5 -112.5h-1152v-128q0 -42 -23.5 -74t-56.5 -45t-71.5 -6.5t-66.5 34.5l-256 256q-39 40 -38 92z" />
+<glyph unicode="&#xf0b5;" d="M2.5 1483.5q6.5 38.5 34.5 67.5l256 256q40 38 92 37.5t89 -37.5l257 -256q30 -30 36 -69t-8.5 -72t-46.5 -55.5t-72 -22.5h-128v-1088q0 -80 56 -136t136 -56t136 56t56 136v1152q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-1088h128q42 0 74 -23.5 t45 -56.5t6.5 -71.5t-34.5 -67.5l-256 -257q-40 -38 -92 -37.5t-89 37.5l-256 257q-30 30 -36 69t8 72t46 55.5t72 22.5h128v1088q0 80 -56 136t-136 56t-136 -56t-56 -136v-1152q0 -185 -131 -316.5t-317 -131.5q-185 0 -316.5 131.5t-131.5 316.5v1088h-128 q-42 0 -74 23.5t-45 56.5t-6.5 71.5z" />
+<glyph unicode="&#xf0b6;" d="M1 158.5q-6 38.5 8.5 71.5t46.5 55.5t72 22.5h128v256q0 159 112.5 271.5t271.5 112.5h128q53 0 90.5 37.5t37.5 90.5v640q0 47 26.5 79.5t64 40t75 0t64 -40t26.5 -79.5v-640q0 -53 37.5 -90.5t90.5 -37.5h128q159 0 271.5 -112.5t112.5 -271.5v-256h128q42 0 74 -23.5 t45 -56.5t6.5 -71.5t-34.5 -67.5l-256 -256q-40 -38 -92 -37.5t-89 37.5l-256 256q-30 30 -36 69t8 72t46 55.5t72 22.5h128v256q0 53 -37.5 90.5t-90.5 37.5h-128q-146 0 -256 100q-110 -100 -256 -100h-128q-53 0 -90.5 -37.5t-37.5 -90.5v-256h128q42 0 74 -23.5 t45 -56.5t6.5 -71.5t-34.5 -66.5l-256 -257q-40 -38 -92.5 -37.5t-89.5 37.5l-256 257q-30 30 -36 68.5z" />
+<glyph unicode="&#xf0b7;" d="M1 158.5q-6 38.5 8.5 71.5t46.5 55.5t72 22.5h128v256q0 159 111.5 271.5t270.5 112.5h768q53 0 91.5 37.5t38.5 90.5v640q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-640q0 -159 -113.5 -271.5t-272.5 -112.5h-768q-53 0 -89.5 -37.5t-36.5 -90.5v-256h128 q42 0 74 -23.5t45 -56.5t6.5 -71.5t-34.5 -66.5l-256 -257q-40 -38 -92.5 -37.5t-89.5 37.5l-256 257q-30 30 -36 68.5zM1282 158q-6 39 8 72t46 55.5t72 22.5h128v274q98 20 150 51.5t106 107.5v-433l128 -1q42 0 74 -23.5t45 -56.5t6.5 -71.5t-34.5 -66.5l-256 -257 q-40 -38 -92 -37.5t-89 37.5l-256 257q-30 30 -36 69z" />
+<glyph unicode="&#xf0b8;" d="M0 1332v384q0 47 26.5 79.5t64 40t75 0t64 -40t26.5 -79.5v-384q0 -53 37.5 -90.5t90.5 -37.5h384q146 0 256 -100q110 100 256 100h384q53 0 90.5 37.5t37.5 90.5v383q0 47 26.5 79.5t64 40t75 0t64 -40t26.5 -79.5v-384q0 -159 -112.5 -271.5t-271.5 -112.5h-384 q-53 0 -90.5 -37.5t-37.5 -90.5v-512h128q42 0 74 -23.5t45 -56.5t6.5 -71.5t-34.5 -66.5l-256 -257q-40 -38 -92 -37.5t-89 37.5l-256 257q-30 30 -36 69t8 72t46 55.5t72 22.5h128v512q0 53 -37.5 90.5t-90.5 37.5h-384q-159 0 -271.5 112.5t-112.5 271.5z" />
+<glyph unicode="&#xf0b9;" d="M0 -76v512q0 53 37.5 90.5t90.5 37.5h512q53 0 90.5 -37.5t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5zM2 1182q-6 39 8 72t46 55.5t72 22.5h128q0 159 112.5 271.5t271.5 112.5h256q47 0 79.5 -26.5t40 -64t0 -75t-40 -64 t-79.5 -26.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5h128q42 0 74 -23.5t45 -56.5t6.5 -71.5t-34.5 -66.5l-256 -256q-41 -39 -92.5 -38.5t-88.5 37.5l-256 256q-30 30 -36 69zM256 52h256v256h-256v-256zM1032.5 14q-7.5 38 0 75.5t40 64t79.5 26.5h256q53 0 90.5 37.5 t37.5 90.5h-128q-42 0 -74 23.5t-45 56.5t-6.5 71.5t35.5 66.5l256 256q40 39 91.5 38.5t89.5 -37.5l256 -256q30 -30 36 -69t-8.5 -72t-46.5 -55.5t-72 -22.5h-128q0 -159 -112.5 -272t-271.5 -113h-256q-47 0 -79.5 26.5t-40 64.5zM1280 1204v512q0 53 37.5 90.5 t90.5 37.5h512q53 0 90.5 -37.5t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5zM1536 1332h256v256h-256v-256z" />
+<glyph unicode="&#xf0ba;" d="M0 308v512q0 53 37.5 90.5t90.5 37.5h512q53 0 90.5 -37.5t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5zM256 436h256v256h-256v-256zM384 52h512v512h128q53 0 90.5 -37.5t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-512 q-53 0 -90.5 37.5t-37.5 90.5v128zM640 1462q1 52 38 89l256 256q30 30 68.5 36t71.5 -8.5t55.5 -46.5t22.5 -72v-128h256q159 0 271.5 -112.5t112.5 -271.5v-256h128q42 0 74 -23.5t45 -56.5t6.5 -71.5t-35.5 -66.5l-256 -256q-37 -38 -90.5 -38t-90.5 38l-256 256 q-30 30 -36 68.5t8.5 71.5t46.5 55.5t72 22.5h128v256q0 53 -37.5 90.5t-90.5 37.5h-256v-128q0 -42 -23.5 -74t-56.5 -45t-71.5 -6.5t-66.5 35.5l-256 256q-39 40 -38 92z" />
+<glyph unicode="&#xf0bb;" d="M0 53v512q0 53 37.5 90.5t90.5 37.5h512q53 0 90.5 -37.5t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5zM0 1334q1 52 38 89l256 256q30 30 68.5 36t71.5 -8.5t55.5 -46.5t22.5 -72v-128h128v-256h-128v-128q0 -42 -23.5 -74 t-56.5 -45t-71.5 -6.5t-66.5 35.5l-256 256q-39 40 -38 92zM256 181h256v256h-256v-256zM768 1205v256h128v-256h-128zM896 181v256h128v-256h-128zM1024 1205v256h128v-256h-128zM1152 181v256h128v-256h-128zM1280 1077v512q0 53 37.5 90.5t90.5 37.5h512q53 0 90.5 -37.5 t37.5 -90.5v-512q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5zM1408 181v256h128v128q0 42 23.5 74t56.5 45t71.5 6.5t67.5 -34.5l256 -256q38 -40 37.5 -92t-37.5 -89l-256 -256q-30 -30 -69 -36t-72 8t-55.5 46t-22.5 72v128h-128zM1536 1205h256 v256h-256v-256z" />
+<glyph unicode="&#xf0bc;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v384l-512 512h-1024l-512 -512v-384zM256 436l362 384h812l362 -384h-384v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5v128h-384z" />
+<glyph unicode="&#xf0bd;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v384l-441 441q-23 -40 -55 -72l-118 -117l358 -380h-384v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5v128h-384l358 379l-117 118q-30 30 -56 72l-441 -441v-384z M642.5 1180.5q6.5 -38.5 35.5 -66.5l256 -256q40 -39 92 -38t89 38l256 256q30 30 36 68.5t-8.5 71.5t-46.5 55.5t-72 22.5h-128v384q0 47 -26.5 79.5t-64 40t-75 0t-64 -40t-26.5 -79.5v-384h-128q-42 0 -74 -23.5t-45 -56.5t-6.5 -71.5z" />
+<glyph unicode="&#xf0be;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v384l-512 512h-128v-256h22l362 -384h-384v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-512q-53 0 -90.5 37.5t-37.5 90.5v128h-384l362 384h22v256h-128l-512 -512v-384zM642 1482q-6 -39 8 -72 t46 -55.5t72 -22.5h128v-384q0 -47 26.5 -79.5t64 -40t75 0t64 40t26.5 79.5v384h128q42 0 74 23.5t45 56.5t6.5 71.5t-34.5 67.5l-256 256q-40 39 -92 38t-89 -38l-256 -256q-30 -30 -36 -69z" />
+<glyph unicode="&#xf0c0;" d="M0 1204q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q132 0 256 54v-182h256v-128h256v-256h256v-256h384v384l-640 512v256h-182q54 125 54 256q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5t-248.5 50.5q-174 0 -321 -85.5t-233 -233t-86 -321.5zM256 1332 q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf0c1;" d="M0 1204q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q132 0 256 54v-182h256v-128h256v-256h256v-256h384v512l-640 512v128h-182q54 125 54 256q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5t-248.5 50.5q-174 0 -321 -85.5t-233 -233t-86 -321.5zM256 1332 q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf0c2;" d="M256 -76q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v896q0 53 -37.5 90.5t-90.5 37.5v256q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5t-248.5 50.5q-174 0 -321 -85.5t-233 -233t-86 -321.5v-256q-53 0 -90.5 -37.5t-37.5 -90.5v-896zM512 52v640 h1024v-640h-1024zM640 948v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5v-256h-768z" />
+<glyph unicode="&#xf0c3;" d="M256 -76v896q0 53 37.5 90.5t90.5 37.5v256q0 174 86 321.5t233 233t321 85.5q231 0 406.5 -145.5t220.5 -366.5h-266q-40 113 -138.5 184.5t-222.5 71.5q-159 0 -271.5 -112.5t-112.5 -271.5v-256h1024q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5 h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 52h1024v640h-1024v-640z" />
+<glyph unicode="&#xf0c4;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM128 436v128q0 53 37.5 90.5t90.5 37.5v256q-53 0 -90.5 37.5t-37.5 90.5v128q0 53 37.5 90.5 t90.5 37.5v128q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v128q-53 0 -90.5 37.5t-37.5 90.5zM256 500q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM256 1140 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 308q0 -53 37.5 -90.5t90.5 -37.5h1024q53 0 90.5 37.5t37.5 90.5v1024q0 53 -37.5 90.5t-90.5 37.5h-1024q-53 0 -90.5 -37.5t-37.5 -90.5q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5 t-90.5 -37.5v-256q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5zM640 820q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM768 820q0 -106 75 -181t181 -75t181 75t75 181t-75 181 t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="&#xf0c5;" d="M0 820q0 -53 37.5 -90.5t90.5 -37.5h256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5zM262 187q0 -53 38 -91t91 -38t90 38l181 181q38 37 38 90t-38 91t-91 38t-90 -38l-181 -181q-38 -37 -38 -90zM262 1453q0 -53 38 -90 l181 -181q37 -38 90 -38t91 38t38 91t-38 90l-181 181q-37 38 -90 38t-91 -38t-38 -91zM896 -76q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-256zM896 1460q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5v256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-256zM1348 367q0 -53 38 -90l181 -181q37 -38 90 -38t91 38t38 91t-38 90l-181 181q-37 38 -90 38t-91 -38t-38 -91zM1348 1273q0 -53 38 -91t91 -38t90 38l181 181q38 37 38 90t-38 91t-91 38t-90 -38 l-181 -181q-38 -37 -38 -90zM1536 820q0 -53 37.5 -90.5t90.5 -37.5h256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf0c6;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5z" />
+<glyph unicode="&#xf0c7;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM512 820q0 -212 150 -362t362 -150t362 150t150 362t-150 362 t-362 150t-362 -150t-150 -362z" />
+<glyph unicode="&#xf0c8;" d="M0 -76q0 -53 37.5 -90.5t90.5 -37.5h256q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5h256q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5h256q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5h256q53 0 90.5 37.5t37.5 90.5v256q-53 0 -90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5v256q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5v256q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5v256q0 53 -37.5 90.5t-90.5 37.5h-256q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5h-256q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5h-256q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-256q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-256q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-256q53 0 90.5 -37.5 t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-256zM256 52v1536h1536v-1536h-1536zM384 180h1280v1280h-1280v-1280zM512 308v1024h1024v-1024h-1024z" />
+<glyph unicode="&#xf0c9;" d="M0 -76v256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v256q0 53 37.5 90.5t90.5 37.5h256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5h256 q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5h256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5h256q53 0 90.5 -37.5t37.5 -90.5v-256q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5v-256q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5v-256 q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5h-256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5h-256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5h-256q-53 0 -90.5 37.5t-37.5 90.5zM256 52h1536v1536h-1536v-1536zM384 180v1280h1280v-1280h-1280zM512 308h512v128h-512v-128zM512 564h896v128h-896v-128zM512 820h640v128h-640v-128zM512 1204h384v128h-384v-128zM1408 1204h128v128h-128v-128z" />
+<glyph unicode="&#xf0ca;" d="M0 948l590 -442l1202 1082l-934 -1284l678 -508l512 2048zM512 -204l384 256l-384 256v-512z" />
+<glyph unicode="&#xf0cb;" d="M0 820l768 -256l256 -768l1024 2048zM896 692l768 768l-640 -1152z" />
+<glyph unicode="&#xf0cc;" d="M0 52q0 -106 75 -181t181 -75t181 75t75 181q0 -106 75 -181t181 -75t181 75t75 181q0 -106 75 -181t181 -75t181 75t75 181q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75q106 0 181 75t75 181t-75 181t-181 75q106 0 181 75t75 181t-75 181t-181 75 q106 0 181 75t75 181t-75 181t-181 75t-181 -75t-75 -181q0 106 -75 181t-181 75t-181 -75t-75 -181q0 106 -75 181t-181 75t-181 -75t-75 -181q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75q-106 0 -181 -75t-75 -181t75 -181t181 -75q-106 0 -181 -75 t-75 -181t75 -181t181 -75q-106 0 -181 -75t-75 -181zM384 180v1280h1280v-1280h-1280zM512 820q0 -212 150 -362t362 -150h64q26 0 45 19t19 45t-19 45t-45 19h-64q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5v-192 q0 -26 -19 -45t-45 -19t-45 19t-19 45v192q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75q68 0 131 37q10 -70 63.5 -117.5t125.5 -47.5q80 0 136 56t56 136v192q0 212 -150 362t-362 150t-362 -150t-150 -362zM896 820q0 53 37.5 90.5t90.5 37.5t90.5 -37.5 t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0cd;" d="M128 52v-128q0 -53 37.5 -90.5t90.5 -37.5v256h-128zM128 244q0 -26 19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 436h128v768h-128v-768zM128 1396q0 -26 19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19h-128q-26 0 -45 -19 t-19 -45zM128 1588h128v256q-53 0 -90.5 -37.5t-37.5 -90.5v-128zM384 52v-128q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1792q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-128q53 0 90.5 -37.5t37.5 -90.5v-128 q0 -53 -37.5 -90.5t-90.5 -37.5v-768q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5zM768 500q15 86 68.5 157.5t130.5 114.5q-71 74 -71 176v128q0 106 75 181t181 75t181 -75t75 -181v-128q0 -103 -71 -176q77 -43 130.5 -114.5t68.5 -157.5 q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z" />
+<glyph unicode="&#xf0ce;" d="M128 52v-128q0 -53 37.5 -90.5t90.5 -37.5v256h-128zM128 244q0 -26 19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 436h128v768h-128v-768zM128 1396q0 -26 19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19h-128q-26 0 -45 -19 t-19 -45zM128 1588h128v256q-53 0 -90.5 -37.5t-37.5 -90.5v-128zM384 52v-128q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1792q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-128q53 0 90.5 -37.5t37.5 -90.5v-128 q0 -53 -37.5 -90.5t-90.5 -37.5v-768q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5zM640 820q0 212 150 362t362 150t362 -150t150 -362v-192q0 -80 -56 -136t-136 -56q-72 0 -125.5 47.5t-63.5 117.5q-61 -37 -131 -37q-106 0 -181 75t-75 181t75 181 t181 75t181 -75t75 -181v-192q0 -26 19 -45t45 -19t45 19t19 45v192q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5h64q26 0 45 -19t19 -45t-19 -45t-45 -19h-64q-212 0 -362 150t-150 362zM1024 820q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf0d0;" d="M0 372v1152q0 64 30 120t83 92q65 44 143 44q48 0 95 -18l640 -256q5 -2 33 -20q28 18 33 20l640 256q47 18 95 18q79 0 144 -44q53 -36 82.5 -92t29.5 -120v-1152q0 -79 -44 -144t-117 -94l-640 -256q-46 -18 -95 -18q-64 0 -128 37q-63 -37 -128 -37q-48 0 -95 18 l-640 256q-73 29 -117 94t-44 144zM256 372l640 -256v1152l-640 256v-1152zM1152 116l640 256v1152l-640 -256v-1152z" />
+<glyph unicode="&#xf0d1;" d="M0 372v1152q0 64 30 120t83 92q65 44 143 44q48 0 95 -18l640 -256q5 -2 33 -20q28 18 33 20l640 256q47 18 95 18q79 0 144 -44q53 -36 82.5 -92t29.5 -120v-1152q0 -79 -44 -144t-117 -94l-640 -256q-46 -18 -95 -18q-64 0 -128 37q-63 -37 -128 -37q-48 0 -95 18 l-640 256q-73 29 -117 94t-44 144zM256 372l640 -256v1152l-640 256v-1152zM384 449v128l384 -154v-128zM384 705v128l384 -154v-128zM384 961v128l384 -154v-128zM384 1217v128l384 -154v-128zM1152 116l640 256v1152l-640 -256v-1152zM1280 295v128l384 154v-128z M1280 551v128l384 154v-128zM1280 807v128l384 154v-128zM1280 1063v128l384 154v-128z" />
+<glyph unicode="&#xf0d2;" d="M0 180q0 -53 37.5 -90.5t90.5 -37.5q123 -6 245 -18.5t277.5 -46.5t249.5 -82q8 -47 42.5 -78t81.5 -31q48 0 82.5 31t41.5 78q94 48 249.5 82t277.5 46.5t245 18.5q53 0 90.5 37.5t37.5 90.5v1536q0 53 -37.5 90.5t-90.5 37.5q-2 0 -6 -1t-7 -1q-609 -16 -812 -161 q-65 -49 -71 -93l-6 22q-37 81 -203 139q-233 81 -674 93q-3 0 -7 1t-6 1q-53 0 -90.5 -37.5t-37.5 -90.5v-1536zM256 301v1276q441 -33 640 -134v-1263q-198 99 -640 121zM1152 180v1263q199 101 640 134v-1276q-442 -22 -640 -121z" />
+<glyph unicode="&#xf0d3;" d="M0 180q0 -53 37.5 -90.5t90.5 -37.5q123 -6 245 -18.5t277.5 -46.5t249.5 -82q8 -47 42.5 -78t81.5 -31q48 0 82.5 31t41.5 78q94 48 249.5 82t277.5 46.5t245 18.5q53 0 90.5 37.5t37.5 90.5v1536q0 53 -37.5 90.5t-90.5 37.5q-2 0 -6 -1t-7 -1q-609 -16 -812 -161 q-65 -49 -71 -93l-6 22q-37 81 -203 139q-233 81 -674 93q-3 0 -7 1t-6 1q-53 0 -90.5 -37.5t-37.5 -90.5v-1536zM256 301v1276q441 -33 640 -134v-1263q-198 99 -640 121zM384 564q8 0 22 -0.5t53.5 -3t76 -6.5t81 -14t76 -23t53.5 -34t22 -47v256q0 5 -2.5 13.5t-23 31 t-56.5 39t-115 30.5t-187 14v-256zM384 1076q8 0 22 -0.5t53.5 -3t76 -6.5t81 -14t76 -23t53.5 -34t22 -47v256q0 5 -2.5 13.5t-23 31t-56.5 39t-115 30.5t-187 14v-256zM1152 180v1263q199 101 640 134v-1276q-442 -22 -640 -121zM1280 436q0 36 39.5 62.5t96 38.5 t113 18.5t95.5 7.5l40 1v256q-108 0 -187 -13t-115 -32t-56.5 -38t-23.5 -32l-2 -13v-256zM1280 948q0 36 39.5 62.5t96 38.5t113 18.5t95.5 7.5l40 1v256q-108 0 -187 -13t-115 -32t-56.5 -38t-23.5 -32l-2 -13v-256z" />
+<glyph unicode="&#xf0d4;" d="M0 -204h1280v1095q123 -71 256 -71q212 0 362 150t150 362t-150 362t-362 150h-1024q-212 0 -362 -150t-150 -362v-1536zM256 52v1280q0 106 76 181t180 75h583q-71 -123 -71 -256v-1280h-768zM384 180h512v128h-512v-128zM384 564h512v128h-512v-128zM384 948h512v128 h-512v-128zM384 1332h512v128h-512v-128zM1280 1332q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf0d5;" d="M0 -204l256 256l256 -256l256 256l256 -256l256 256l256 -256v1024q212 0 362 150t150 362t-150 362t-362 150h-1152q-159 0 -271.5 -112.5t-112.5 -271.5v-1664zM256 436v1024q0 53 37.5 90.5t90.5 37.5h896v-1152l-256 -256l-256 256l-256 -256zM512 692h512v128h-512 v-128zM512 948h512v128h-512v-128zM512 1204h512v128h-512v-128zM1536 1076v512q106 0 181 -75t75 -181t-75 -181t-181 -75z" />
+<glyph unicode="&#xf0d6;" d="M0 -204l256 256l256 -256l256 256l256 -256l256 256l256 -256l256 256l256 -256v1664q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1664zM256 436v1024q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1024l-256 -256 l-256 256l-256 -256l-256 256l-256 -256zM512 692h1024v128h-1024v-128zM512 948h1024v128h-1024v-128zM512 1204h1024v128h-1024v-128z" />
+<glyph unicode="&#xf0d7;" d="M256 180q0 -104 103 -192.5t279.5 -140t385.5 -51.5t385.5 51.5t279.5 140t103 192.5v216q0 -103 -104 -182.5t-277.5 -120.5t-386.5 -41t-386.5 41t-277.5 120.5t-104 182.5v-216zM256 564q0 -104 103 -192.5t279.5 -140t385.5 -51.5t385.5 51.5t279.5 140t103 192.5 v216q0 -103 -104 -182.5t-277.5 -120.5t-386.5 -41t-386.5 41t-277.5 120.5t-104 182.5v-216zM256 948q0 -104 103 -192.5t279.5 -140t385.5 -51.5t385.5 51.5t279.5 140t103 192.5v216q0 -103 -104 -182.5t-277.5 -120.5t-386.5 -41t-386.5 41t-277.5 120.5t-104 182.5 v-216zM256 1332q0 -104 103 -192.5t279.5 -140t385.5 -51.5t385.5 51.5t279.5 140t103 192.5v128q0 104 -103 192.5t-279.5 140t-385.5 51.5t-385.5 -51.5t-279.5 -140t-103 -192.5v-128z" />
+<glyph unicode="&#xf0d8;" d="M256 180q0 -104 103 -192.5t279.5 -140t385.5 -51.5q8 0 21.5 1t20.5 1q-143 101 -223 263q-260 25 -423.5 114t-163.5 221v-216zM256 564q0 -127 150 -227t386 -137q-24 94 -24 172q0 7 8 82q-234 32 -377 117.5t-143 208.5v-216zM256 948q0 -129 153.5 -229t394.5 -137 q42 135 132 241q-193 9 -345.5 52t-243.5 118t-91 171v-216zM256 1332q0 -104 103 -192.5t279.5 -140t385.5 -51.5q8 0 24 1t24 1q182 126 400 126q36 0 104 -10q102 53 159 121.5t57 144.5v128q0 104 -103 192.5t-279.5 140t-385.5 51.5t-385.5 -51.5t-279.5 -140 t-103 -192.5v-128zM896 372q0 -156 77 -289t210 -210.5t289 -77.5t289 77.5t210 210.5t77 289q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5zM1280 308h128v-128h128v128h128v128h-128v128h-128v-128h-128v-128zM1734 1024q12 -5 58 -29v169q0 -76 -58 -140z" />
+<glyph unicode="&#xf0d9;" d="M256 180q0 -104 103 -192.5t279.5 -140t385.5 -51.5q8 0 21.5 1t20.5 1q-143 101 -223 263q-260 25 -423.5 114t-163.5 221v-216zM256 564q0 -127 150 -227t386 -137q-24 94 -24 172q0 7 8 82q-234 32 -377 117.5t-143 208.5v-216zM256 948q0 -129 153.5 -229t394.5 -137 q42 135 132 241q-193 9 -345.5 52t-243.5 118t-91 171v-216zM256 1332q0 -104 103 -192.5t279.5 -140t385.5 -51.5q8 0 24 1t24 1q182 126 400 126q36 0 104 -10q102 53 159 121.5t57 144.5v128q0 104 -103 192.5t-279.5 140t-385.5 51.5t-385.5 -51.5t-279.5 -140 t-103 -192.5v-128zM896 372q0 -156 77 -289t210 -210.5t289 -77.5t289 77.5t210 210.5t77 289q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5zM1280 308h384v128h-384v-128zM1734 1024q12 -5 58 -29v169q0 -76 -58 -140z" />
+<glyph unicode="&#xf0da;" d="M0 820q0 -52 9 -128q1 -10 5 -30q8 -54 21 -104q1 -3 2.5 -9t2.5 -9q36 -127 103 -239q134 -228 362 -362q112 -67 239 -103q3 -1 9 -2.5t9 -2.5q45 -12 104 -22q5 -1 15 -2t15 -2q63 -9 128 -9t128 9q5 1 15 2t15 2q59 10 104 22q3 1 9 2.5t9 2.5q125 35 239 103 q228 134 362 362q67 112 103 239q1 3 2.5 9t2.5 9q12 45 22 104q1 5 2.5 15t1.5 15q9 63 9 128t-9 128q0 5 -1.5 15t-2.5 15q-10 59 -22 104q-1 3 -2.5 9t-2.5 9q-35 125 -103 239q-134 228 -362 362q-114 68 -239 103q-3 1 -9 2.5t-9 2.5q-45 12 -104 22q-5 1 -15 2.5 t-15 1.5q-63 9 -128 9t-128 -9q-5 0 -15 -1.5t-15 -2.5q-59 -10 -104 -22q-3 -1 -9 -2.5t-9 -2.5q-127 -36 -239 -103q-228 -134 -362 -362q-68 -114 -103 -239q-1 -3 -2.5 -9t-2.5 -9q-13 -50 -21 -104q-4 -20 -5 -30q-9 -76 -9 -128zM128 820q0 220 111 423l190 -190 q-45 -117 -45 -233t45 -232l-190 -191q-111 203 -111 423zM512 820q0 39 8 79q3 18 11 52q35 133 132 230t230 132q18 5 52 11q42 8 79 8q39 0 79 -8q34 -6 52 -11q133 -35 230 -132t132 -230q5 -17 11 -51q8 -42 8 -80q0 -37 -8 -79q-6 -34 -11 -52q-35 -133 -132 -230 t-230 -132q-34 -8 -52 -11q-40 -8 -79 -8q-37 0 -79 8q-18 3 -52 11q-133 35 -230 132t-132 230q-8 34 -11 52q-8 42 -8 79zM601 35l190 190q117 -45 233 -45q119 0 233 46l190 -191q-203 -111 -423 -111t-423 111zM601 1605q203 111 423 111t423 -111l-190 -190 q-116 45 -233 45q-116 0 -233 -45zM1619 588q45 117 45 233t-45 232l190 190q111 -203 111 -423t-111 -423z" />
+<glyph unicode="&#xf0db;" d="M0 53q0 -106 75 -181t181 -75t181 75l164 164q77 -42 167 -70v269q-111 49 -196 134t-133 195h-269q28 -89 69 -166l-164 -164q-75 -75 -75 -181zM0 1587q0 -106 75 -181l164 -164q-41 -77 -69 -166h269q49 111 134 196t195 133v269q-90 -28 -167 -70l-164 164 q-75 75 -181 75t-181 -75t-75 -181zM128 51q0 53 37 91l144 144q77 -104 181 -181l-144 -144q-38 -37 -91 -37t-90 37t-37 90zM128 1587q0 53 37 91t90 38t91 -38l144 -144q-104 -77 -181 -181l-144 144q-37 37 -37 90zM129 820q0 -62 11 -128h257q-12 61 -12 128 q0 54 14 128h-259q-11 -66 -11 -128zM896 -66q70 -10 128 -10t128 10v260q-74 -14 -128 -14t-128 14v-260zM896 1447q61 12 128 12q66 0 128 -12v257q-66 11 -128 11t-128 -11v-257zM1280 -35q90 28 167 70l164 -164q75 -75 181 -75t181 75t75 181t-75 181l-164 164 q42 77 69 167h-269q-48 -110 -133 -195t-196 -134v-270zM1280 1405q110 -48 195 -133t134 -196h269q-28 89 -69 166l164 164q75 75 75 181t-75 181t-181 75t-181 -75l-164 -164q-70 38 -167 70v-269zM1558 105q104 77 181 181l144 -144q37 -38 37 -91t-37 -90t-90 -37 t-91 37zM1558 1534l144 144q38 38 91 38t90 -38t37 -91t-37 -90l-144 -144q-74 101 -181 181zM1649 948q14 -74 14 -128q0 -66 -12 -128h257q11 66 11 128t-11 128h-259z" />
+<glyph unicode="&#xf0dc;" d="M0 53q0 -106 75 -181t181 -75t181 75l164 164q139 -76 295 -101v392q-134 35 -232 133t-133 232h-391q24 -156 99 -294l-164 -164q-75 -75 -75 -181zM0 1587q0 -106 75 -181l164 -164q-75 -138 -99 -294h391q35 134 133 232t232 133v391q-155 -24 -295 -100l-164 164 q-75 75 -181 75t-181 -75t-75 -181zM128 53q0 53 37 90l144 144q77 -104 181 -181l-144 -144q-38 -38 -91 -38t-90 38t-37 91zM128 1587q0 53 37 91t90 38t91 -38l144 -144q-104 -77 -181 -181l-144 144q-37 37 -37 90zM1152 -65q156 25 295 101l164 -164q75 -75 181 -75 t181 75t75 181t-75 181l-164 164q75 138 99 294h-391q-35 -134 -133 -232t-232 -133v-392zM1152 1313q134 -35 232 -133t133 -232h391q-24 156 -99 294l164 164q75 75 75 181t-75 181t-181 75t-181 -75l-164 -164q-140 76 -295 100v-391zM1558 106q104 77 181 181l144 -144 q37 -37 37 -90t-37 -91t-90 -38t-91 38zM1558 1534l144 144q38 38 91 38t90 -38t37 -91t-37 -90l-144 -144q-77 104 -181 181z" />
+<glyph unicode="&#xf0dd;" d="M0 820q0 -280 139 -515.5t373 -370.5v118q0 82 32 173q-134 108 -211 263t-77 332q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -177 -77 -332t-211 -263q32 -86 32 -173v-118q234 135 373 370.5t139 515.5q0 209 -81 398.5t-218 326.5 t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM384 820q0 -140 58 -264t160 -214q75 108 197 168q-74 54 -116.5 135t-42.5 175q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5q0 -94 -42.5 -175t-116.5 -135q122 -60 197 -168 q102 90 160 214t58 264q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5t-248.5 50.5q-174 0 -321 -85.5t-233 -233t-86 -321.5zM640 52v-256h768v256q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM768 820q0 -106 75 -181t181 -75t181 75t75 181t-75 181 t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="&#xf0de;" d="M209 1507l182 -182q129 129 296 196t337 67t337.5 -67t296.5 -196l181 182q-166 165 -381.5 251.5t-433.5 86.5t-433.5 -86.5t-381.5 -251.5zM384 52v-128q0 -53 37.5 -90.5t90.5 -37.5h1024q53 0 90.5 37.5t37.5 90.5v128q-27 133 -113.5 245.5t-207.5 181.5 q65 97 65 213q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5q0 -116 65 -213q-121 -70 -207.5 -182t-113.5 -245zM481 1235l181 -181q98 98 230 133t264 0t230 -133l181 181q-148 148 -345.5 200t-395 0t-345.5 -200zM664 52q40 113 138 184.5t222 71.5 t222.5 -71.5t138.5 -184.5h-721zM896 692q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0e0;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1024q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-512q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h512 q53 0 90.5 -37.5t37.5 -90.5v-128h640q53 0 90.5 -37.5t37.5 -90.5v-1024q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0e1;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1088q157 0 290 78t209.5 210.5t76.5 287.5v832q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-512q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h512 q53 0 90.5 -37.5t37.5 -90.5v-128l640 1q53 0 90.5 -37.5t37.5 -90.5v-353q-145 97 -320 97q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -175 97 -321h-609q-53 0 -90.5 37.5t-37.5 90.5zM1152 373q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5 q0 -134 -95.5 -227t-224.5 -93q-133 0 -226.5 93.5t-93.5 226.5zM1280 309h128v-128h128v128h128v128h-128v128h-128v-128h-128v-128z" />
+<glyph unicode="&#xf0e2;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1088q117 0 223.5 45.5t184 123t123 184t45.5 223.5v832q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-512q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h512 q53 0 90.5 -37.5t37.5 -90.5v-128h640q53 0 90.5 -37.5t37.5 -90.5v-352q-145 97 -320 97q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -175 97 -321h-609q-53 0 -90.5 37.5t-37.5 90.5zM1152 373q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5 q0 -134 -95.5 -227t-224.5 -93q-133 0 -226.5 93.5t-93.5 226.5zM1280 309h384v128h-384v-128z" />
+<glyph unicode="&#xf0e3;" d="M0 180q0 -160 112.5 -272.5t271.5 -112.5h896q159 0 271.5 112.5t112.5 272.5v640q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-128q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 180v896q0 53 37.5 90.5t90.5 37.5h128q53 0 90.5 -37.5 t37.5 -90.5v-128h640q53 0 90.5 -37.5t37.5 -90.5v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-896q-53 0 -90.5 37.5t-37.5 90.5zM408 1588h232q124 0 222.5 -71.5t138.5 -184.5h407q159 0 271.5 -112.5t112.5 -271.5v-745q113 40 184.5 138.5t71.5 222.5v640q0 159 -112.5 271.5 t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-128q-123 0 -221.5 -71t-138.5 -185z" />
+<glyph unicode="&#xf0e4;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1024q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-512q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h512 q53 0 90.5 -37.5t37.5 -90.5v-128h640q53 0 90.5 -37.5t37.5 -90.5v-128h-1152q-53 0 -90.5 -37.5t-37.5 -90.5v-896h-128q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf0e5;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h512q124 0 222.5 -71.5t138.5 -184.5h407q159 0 271.5 -112.5t112.5 -271.5v-1024q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h128v896 q0 53 37.5 90.5t90.5 37.5h1152v128q0 53 -37.5 90.5t-90.5 37.5h-640v128q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM1152 372q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5z M1280 308v128h128v128h128v-128h128v-128h-128v-128h-128v128h-128z" />
+<glyph unicode="&#xf0e6;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1024q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-512q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h512 q53 0 90.5 -37.5t37.5 -90.5v-128h640q53 0 90.5 -37.5t37.5 -90.5v-128h-1152q-53 0 -90.5 -37.5t-37.5 -90.5v-896h-128q-53 0 -90.5 37.5t-37.5 90.5zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5 zM1280 308h384v128h-384v-128z" />
+<glyph unicode="&#xf0e7;" d="M0 180q0 -160 112.5 -272.5t271.5 -112.5h896q159 0 271.5 112.5t112.5 272.5v640q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -139 184.5t-222 71.5h-128q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM256 180v896q0 53 37.5 90.5t90.5 37.5h128q53 0 90.5 -37.5 t37.5 -90.5v-128h640q53 0 90.5 -37.5t37.5 -90.5v-128h-768q-53 0 -90.5 -37.5t-37.5 -90.5v-512h-128q-53 0 -90.5 37.5t-37.5 90.5zM408 1588h232q124 0 222.5 -71.5t138.5 -184.5h407q159 0 271.5 -112.5t112.5 -271.5v-745q113 40 184.5 138.5t71.5 222.5v640 q0 159 -112.5 271.5t-271.5 112.5h-407q-40 113 -138.5 184.5t-222.5 71.5h-128q-123 0 -221.5 -71t-138.5 -185z" />
+<glyph unicode="&#xf0e8;" d="M0 564q0 -140 69.5 -258t187 -186t255.5 -68h1152q159 0 271.5 112.5t112.5 271.5v128q0 159 -113.5 271.5t-270.5 112.5q-3 0 -9 -1t-10 -1q19 73 19 130q0 212 -150 362t-362 150q-183 0 -323.5 -115t-177.5 -291q-74 22 -139 22q-212 0 -362 -150t-150 -362v-128z" />
+<glyph unicode="&#xf0e9;" d="M0 820v128q0 212 150 362t362 150q65 0 139 -22q37 176 177.5 291t323.5 115q212 0 362 -150t150 -362q0 -57 -19 -130q14 2 19 2q159 0 271.5 -112.5t112.5 -271.5v-128q0 -159 -112.5 -271.5t-271.5 -112.5h-23q18 52 21 92q8 85 -20.5 165t-89.5 142l-256 256 q-113 113 -272 113t-271 -112l-256 -256q-61 -62 -90 -142.5t-21 -167.5q4 -36 17 -78q-174 38 -288.5 178t-114.5 322zM641 424q-6 60 37 102l256 256q38 38 90 38q53 0 91 -38l256 -256q42 -42 37 -102q-1 -19 -9 -37q-15 -36 -47.5 -57.5t-71.5 -21.5h-128v-384 q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v384h-128q-38 0 -70.5 21.5t-47.5 57.5q-8 18 -9 37z" />
+<glyph unicode="&#xf0ea;" d="M0 820q0 -185 116.5 -325.5t293.5 -176.5q1 1 1.5 3l1 4t0.5 3q36 85 86.5 137.5t140.5 76.5v150q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5v-150q90 -25 140.5 -77t86.5 -138l6 -19h23q159 0 271.5 112.5t112.5 271.5v128q0 159 -112.5 271.5 t-271.5 112.5q-5 0 -19 -2q19 73 19 130q0 212 -150 362t-362 150q-183 0 -323.5 -115t-177.5 -291q-74 22 -139 22q-212 0 -362 -150t-150 -362v-128zM641 192q-6 -60 37 -102l256 -257q37 -37 90 -37q54 0 91 37l256 257q42 42 37 102q-3 21 -10 37q-14 36 -46.5 57.5 t-71.5 21.5h-128v384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-384h-128q-39 0 -71 -21.5t-47 -57.5q-8 -18 -9 -37z" />
+<glyph unicode="&#xf0eb;" d="M0 820v128q0 212 150 362t362 150q65 0 139 -22q37 176 177.5 291t323.5 115q212 0 362 -150t150 -362q0 -57 -19 -130l-173 2q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323q0 -1 3 -64h-131q-212 0 -362 150t-150 362zM896 372q0 -117 45.5 -223.5t123 -184 t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5 t-93.5 226.5zM1280 308h128v-128h128v128h128v128h-128v128h-128v-128h-128v-128z" />
+<glyph unicode="&#xf0ec;" d="M0 820q0 -212 150 -362t362 -150h131q-3 63 -3 64q0 169 66 323t177.5 265.5t265.5 177.5t323 66l173 -2q19 73 19 130q0 212 -150 362t-362 150q-183 0 -323.5 -115t-177.5 -291q-74 22 -139 22q-212 0 -362 -150t-150 -362v-128zM896 372q0 -117 45.5 -223.5t123 -184 t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5 t-93.5 226.5zM1280 308h384v128h-384v-128z" />
+<glyph unicode="&#xf0ed;" d="M0 564q0 -212 150 -362t362 -150h1152q159 0 271.5 112.5t112.5 271.5v128q0 159 -112.5 271.5t-271.5 112.5q-3 0 -9 -1t-10 -1q19 73 19 130q0 212 -150 362t-362 150q-183 0 -323.5 -115t-177.5 -291q-74 22 -139 22q-212 0 -362 -150t-150 -362v-128zM768 628 q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5zM896 564h128v-128h128v128h128v128h-128v128h-128v-128h-128v-128z" />
+<glyph unicode="&#xf0ee;" d="M0 564q0 -212 150 -362t362 -150h1152q159 0 271.5 112.5t112.5 271.5v128q0 159 -112.5 271.5t-271.5 112.5q-3 0 -9 -1t-10 -1q19 73 19 130q0 212 -150 362t-362 150q-183 0 -323.5 -115t-177.5 -291q-74 22 -139 22q-212 0 -362 -150t-150 -362v-128zM768 628 q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5zM896 564h384v128h-384v-128z" />
+<glyph unicode="&#xf100;" d="M0 1204l256 640h1536l256 -640q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 -106 -75 -181t-181 -75t-181 75t-75 181zM128 -76h1792v-128h-1792v128zM256 52v768q146 0 256 100 v-612h1024v612q110 -100 256 -100v-768h-1536z" />
+<glyph unicode="&#xf101;" d="M0 1204l256 640h1536l256 -640q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 -106 -75 -181t-181 -75t-181 75t-75 181zM128 -76h384v-128h-384v128zM256 52v768q146 0 256 100v-868 h-256zM640 52h768v-256h-768v256zM1536 52v868q110 -100 256 -100v-768h-256zM1536 -76h384v-128h-384v128z" />
+<glyph unicode="&#xf102;" d="M0 180q0 -53 37.5 -90.5t90.5 -37.5h1792q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-1792q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM128 180v896h1792v-896h-1792zM128 1332v128h1792v-128h-1792zM256 308h256v128h-256v-128zM256 564h384v384h-384v-384 zM640 308h256v128h-256v-128zM1024 308h256v128h-256v-128zM1408 308h128v128h-128v-128zM1664 308h128v128h-128v-128z" />
+<glyph unicode="&#xf103;" d="M0 180v1280q0 53 37.5 90.5t90.5 37.5h1792q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1792q-53 0 -90.5 37.5t-37.5 90.5zM128 180h256v128h-256v-128zM128 692h256v256h-256v-256zM128 1204q0 -53 37.5 -90.5t90.5 -37.5h256q53 0 90.5 37.5 t37.5 90.5v128q0 53 -37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-128zM512 180h896v128h-896v-128zM512 692h256v256h-256v-256zM896 436h128v128h-128v-128zM896 692h256v256h-256v-256zM1152 436h128v128h-128v-128zM1280 692h256v256h-256v-256z M1536 436h128v128h-128v-128zM1664 692h256v256h-256v-256zM1792 436h128v128h-128v-128z" />
+<glyph unicode="&#xf104;" d="M0 180q0 -53 37.5 -90.5t90.5 -37.5h1792q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-1792q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM128 180v896h1792v-896h-1792zM128 1332v128h1792v-128h-1792zM256 308h384v128h-384v-128zM256 564h128v128h-128v-128 zM256 820h384v128h-384v-128zM896 628q0 -133 93.5 -226.5t226.5 -93.5q66 0 128 27q62 -27 128 -27q133 0 226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5q-66 0 -128 -27q-62 27 -128 27q-133 0 -226.5 -93.5t-93.5 -226.5zM1024 628q0 80 56 136t136 56h1 q-65 -88 -65 -192t65 -192h-1q-80 0 -136 56t-56 136zM1280 628q0 84 64 141q64 -57 64 -141t-64 -141q-64 57 -64 141zM1471 436q65 88 65 192t-65 192h1q80 0 136 -56t56 -136t-56 -136t-136 -56h-1z" />
+<glyph unicode="&#xf105;" d="M0 180q0 -53 37.5 -90.5t90.5 -37.5h1792q53 0 90.5 37.5t37.5 90.5v1024h-2048v-1024zM0 1332h2048v128q0 53 -37.5 90.5t-90.5 37.5h-1792q-53 0 -90.5 -37.5t-37.5 -90.5v-128zM640 628q0 133 93.5 226.5t226.5 93.5q85 0 161 -45q-97 -123 -97 -275t97 -275 q-76 -45 -161 -45q-133 0 -226.5 93.5t-93.5 226.5zM1152 628q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5z" />
+<glyph unicode="&#xf106;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1024q159 0 271.5 112.5t112.5 271.5v256h128q53 0 90.5 37.5t37.5 90.5v512q0 53 -37.5 90.5t-90.5 37.5h-128v256q0 159 -112.5 271.5t-271.5 112.5h-1024q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280 q0 53 37.5 90.5t90.5 37.5h1024q53 0 90.5 -37.5t37.5 -90.5v-256h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-512q0 -53 37.5 -90.5t90.5 -37.5h128v-128h128v128h128v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-1024q-53 0 -90.5 37.5t-37.5 90.5zM384 308q0 -53 37.5 -90.5 t90.5 -37.5v128h-128zM384 436h128v128h-128v-128zM384 692h128v128h-128v-128zM384 948h128v128h-128v-128zM384 1204h128v128h-128v-128zM512 1332h128v128h-128v-128zM640 180h128v128h-128v-128zM768 1332h128v128h-128v-128zM896 180h128v128h-128v-128zM1024 1332h128 v128h-128v-128zM1152 180h128v128h-128v-128zM1152 564v512h768v-512h-768zM1280 820q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1280 1332h128q0 53 -37.5 90.5t-90.5 37.5v-128z" />
+<glyph unicode="&#xf107;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1024q124 0 222.5 71.5t138.5 184.5h23q106 0 181 75t75 181v384q0 106 -75 181t-181 75v512q0 159 -112.5 271.5t-271.5 112.5h-1024q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v768h640v-128h-128q-106 0 -181 -75 t-75 -181v-128q0 -106 75 -181t181 -75h128v-128h-512q-53 0 -90.5 37.5t-37.5 90.5zM256 1204v256q0 53 37.5 90.5t90.5 37.5h1024q53 0 90.5 -37.5t37.5 -90.5v-640h-128v640h-1024v-256h-128zM512 1204v128h768v-512h-128v256q0 53 -37.5 90.5t-90.5 37.5h-512zM640 436 v128q0 53 37.5 90.5t90.5 37.5h896q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-896q-53 0 -90.5 37.5t-37.5 90.5zM1152 52v128h384q0 -54 -38.5 -91t-89.5 -37h-256z" />
+<glyph unicode="&#xf108;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1408h-256v128h-256v128h-1536v-1664zM256 180v1408h1024v-1536h-896q-53 0 -90.5 37.5t-37.5 90.5zM384 180h384v128h-384v-128zM384 436h512v128h-512v-128zM384 692h384v128h-384v-128z M384 948h768v512h-768v-512zM896 692h256v128h-256v-128zM1024 436h128v128h-128v-128zM1536 244v1344h128v-1344q0 -26 19 -45t45 -19t45 19t19 45v1216h128v-1216q0 -80 -56 -136t-136 -56t-136 56t-56 136z" />
+<glyph unicode="&#xf109;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1408h-256v128h-256v128h-1536v-1664zM256 180v1408h1024v-1536h-896q-53 0 -90.5 37.5t-37.5 90.5zM1536 244v1344h128v-1344q0 -26 19 -45t45 -19t45 19t19 45v1216h128v-1216 q0 -80 -56 -136t-136 -56t-136 56t-56 136z" />
+<glyph unicode="&#xf10a;" d="M256 -76q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1408l-512 512h-896q-53 0 -90.5 -37.5t-37.5 -90.5v-1792zM512 52v1536h640v-384h384v-1152h-1024z" />
+<glyph unicode="&#xf10b;" d="M256 -76q0 -53 37.5 -90.5t90.5 -37.5h1088q117 0 223.5 45.5t184 123t123 184t45.5 223.5q0 146 -69 271.5t-187 205.5v483l-512 512h-896q-53 0 -90.5 -37.5t-37.5 -90.5v-1792zM512 52v1536h640v-384h384v-262q-37 7 -64 7q-117 0 -223.5 -45.5t-184 -123t-123 -184 t-45.5 -223.5q0 -175 97 -321h-481zM1152 372q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5zM1280 308h128v-128h128v128h128v128h-128v128h-128v-128h-128v-128z" />
+<glyph unicode="&#xf10c;" d="M256 -76v1792q0 53 37.5 90.5t90.5 37.5h896l512 -512v-483q118 -80 187 -205.5t69 -271.5q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5h-1088q-53 0 -90.5 37.5t-37.5 90.5zM512 52h481q-97 146 -97 320q0 117 45.5 223.5t123 184t184 123t223.5 45.5 q22 0 64 -6v262h-384v384h-640v-1536zM1152 372q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5q0 132 -93.5 226t-226.5 94t-226.5 -94t-93.5 -226zM1280 308v128h384v-128h-384z" />
+<glyph unicode="&#xf10d;" d="M128 692q0 -182 71 -348t191 -286t286 -191t348 -71t348 71t286 191t191 286t71 348v1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-1024q0 -174 -85.5 -321t-233 -233t-321.5 -86q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5v512q0 159 112.5 271.5 t271.5 112.5t271.5 -112.5t112.5 -271.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-384q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v384q0 130 -50.5 248.5t-136.5 204.5 t-204.5 136.5t-248.5 50.5q-174 0 -321 -85.5t-233 -233t-86 -321.5v-512z" />
+<glyph unicode="&#xf10e;" d="M320 500q0 -143 55.5 -273.5t150 -225t225 -150t273.5 -55.5t273.5 55.5t225 150t150 225t55.5 273.5v1216q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-1216q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5v832q0 106 75 181t181 75t181 -75 t75 -181v-832q0 -26 -19 -45t-45 -19t-45 19t-19 45v832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-832q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5v832q0 212 -150 362t-362 150t-362 -150t-150 -362v-832z" />
+<glyph unicode="&#xf110;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 436v768q0 53 37.5 90.5t90.5 37.5h128q53 0 90.5 -37.5t37.5 -90.5v-768q0 -53 -37.5 -90.5t-90.5 -37.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM640 436h128v768h-128v-768zM1152 948v256q0 53 37.5 90.5 t90.5 37.5h128q53 0 90.5 -37.5t37.5 -90.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM1280 948h128v256h-128v-256z" />
+<glyph unicode="&#xf111;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 436v768q0 53 37.5 90.5t90.5 37.5h128q53 0 90.5 -37.5t37.5 -90.5v-768q0 -53 -37.5 -90.5t-90.5 -37.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM640 436h128v768h-128v-768zM1152 692v256q0 53 37.5 90.5 t90.5 37.5h128q53 0 90.5 -37.5t37.5 -90.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM1280 692h128v256h-128v-256z" />
+<glyph unicode="&#xf112;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 436v768q0 53 37.5 90.5t90.5 37.5h128q53 0 90.5 -37.5t37.5 -90.5v-768q0 -53 -37.5 -90.5t-90.5 -37.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM640 436h128v768h-128v-768zM1152 436v256q0 53 37.5 90.5 t90.5 37.5h128q53 0 90.5 -37.5t37.5 -90.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-128q-53 0 -90.5 37.5t-37.5 90.5zM1280 436h128v256h-128v-256z" />
+<glyph unicode="&#xf113;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 436v128q0 53 37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM512 1076v128q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 -37.5 t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5t-37.5 90.5zM640 436h768v128h-768v-128zM640 1076h256v128h-256v-128z" />
+<glyph unicode="&#xf114;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 436v128q0 53 37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM640 436h768v128h-768v-128zM768 1076v128q0 53 37.5 90.5 t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5t-37.5 90.5zM896 1076h256v128h-256v-128z" />
+<glyph unicode="&#xf115;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 436v128q0 53 37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM640 436h768v128h-768v-128zM1024 1076v128q0 53 37.5 90.5 t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5t-37.5 90.5zM1152 1076h256v128h-256v-128z" />
+<glyph unicode="&#xf116;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM384 564v128h1280v-128h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5v128h-128zM384 1204v128h1280v-128h-384v-128q0 -53 -37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5 t-37.5 90.5v128h-384zM640 436h768v128h-768v-128zM896 1076h256v128h-256v-128z" />
+<glyph unicode="&#xf117;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM384 436v128h128q0 53 37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5h128v-128h-128q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5h-128zM384 1076v128h384q0 53 37.5 90.5t90.5 37.5 h256q53 0 90.5 -37.5t37.5 -90.5h384v-128h-384q0 -53 -37.5 -90.5t-90.5 -37.5h-256q-53 0 -90.5 37.5t-37.5 90.5h-384zM640 436h768v128h-768v-128zM896 1076h256v128h-256v-128z" />
+<glyph unicode="&#xf118;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM384 308v128h128v128q0 53 37.5 90.5t90.5 37.5h768q53 0 90.5 -37.5t37.5 -90.5v-128h128v-128h-1280zM384 948v128h384v128q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5v-128h384v-128h-1280z M640 436h768v128h-768v-128zM896 1076h256v128h-256v-128z" />
+<glyph unicode="&#xf119;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 180v1280h128v-128h128q53 0 90.5 -37.5t37.5 -90.5v-768q0 -53 -37.5 -90.5t-90.5 -37.5h-128v-128h-128zM640 436h128v768h-128v-768zM1152 180v1280h128v-384h128q53 0 90.5 -37.5t37.5 -90.5v-256 q0 -53 -37.5 -90.5t-90.5 -37.5h-128v-384h-128zM1280 692h128v256h-128v-256z" />
+<glyph unicode="&#xf11a;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 692v256q0 53 37.5 90.5t90.5 37.5h128v384h128v-1280h-128v384h-128q-53 0 -90.5 37.5t-37.5 90.5zM640 692h128v256h-128v-256zM1152 436v768q0 53 37.5 90.5t90.5 37.5h128v128h128v-1280h-128v128h-128 q-53 0 -90.5 37.5t-37.5 90.5zM1280 436h128v768h-128v-768z" />
+<glyph unicode="&#xf11b;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 692v256q0 53 37.5 90.5t90.5 37.5v384h128v-384q53 0 90.5 -37.5t37.5 -90.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5v-384h-128v384q-53 0 -90.5 37.5t-37.5 90.5zM640 692h128v256h-128v-256zM1152 436v768 q0 53 37.5 90.5t90.5 37.5v128h128v-128q53 0 90.5 -37.5t37.5 -90.5v-768q0 -53 -37.5 -90.5t-90.5 -37.5v-128h-128v128q-53 0 -90.5 37.5t-37.5 90.5zM1280 436h128v768h-128v-768z" />
+<glyph unicode="&#xf11c;" d="M0 436q0 -53 37.5 -90.5t90.5 -37.5h384v-384q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-384v384q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM256 564v1024h1024v-512h512v-1024h-1024 v512h-512z" />
+<glyph unicode="&#xf11d;" d="M0 436q0 -53 37.5 -90.5t90.5 -37.5h384v-384q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-384v384q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM768 52v1024h1024v-1024h-1024z" />
+<glyph unicode="&#xf11e;" d="M0 436q0 -53 37.5 -90.5t90.5 -37.5h384v-384q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-384v384q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM256 564v1024h1024v-256h-640 q-53 0 -90.5 -37.5t-37.5 -90.5v-640h-256zM768 52v256h640q53 0 90.5 37.5t37.5 90.5v640h256v-1024h-1024z" />
+<glyph unicode="&#xf120;" d="M0 436q0 -53 37.5 -90.5t90.5 -37.5h384v-384q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-384v384q0 53 -37.5 90.5t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM768 564v512h512v-512h-512z" />
+<glyph unicode="&#xf121;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v896h384v-1024h-256q-53 0 -90.5 37.5t-37.5 90.5zM256 1204v256q0 53 37.5 90.5 t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM768 52v1024h1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-896z" />
+<glyph unicode="&#xf122;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v896h256v-1024h-128q-53 0 -90.5 37.5t-37.5 90.5zM256 1204v256q0 53 37.5 90.5 t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-256h-1536zM640 52v1024h768v-1024h-768zM1536 52v1024h256v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-128z" />
+<glyph unicode="&#xf123;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h896v1024h-1024v-896zM256 1204h1536v256q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-256zM1408 52h256q53 0 90.5 37.5t37.5 90.5v896h-384v-1024z" />
+<glyph unicode="&#xf124;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 308h384v1024h-384v-1024zM1152 308h384v384h-384v-384zM1152 948h384v384h-384v-384z" />
+<glyph unicode="&#xf125;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 308v384h384v-384h-384zM512 948v384h384v-384h-384zM1152 308v1024h384v-1024h-384z" />
+<glyph unicode="&#xf126;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM512 308h384v1024h-384v-1024zM1152 308h384v256h-384v-256zM1152 692h384v256h-384v-256zM1152 1076h384v256h-384v-256z" />
+<glyph unicode="&#xf127;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM512 308v256h384v-256h-384zM512 692v256h384v-256h-384zM512 1076v256h384v-256h-384zM1152 308v1024h384v-1024h-384z" />
+<glyph unicode="&#xf128;" d="M0 -204h256v128h128v128h-128v128h128v128h-256v128h256v128h-128v128h128v128h-128v128h128v128h-128v128h128v128h-384v-1536zM0 1460h384v384h-384v-384zM512 -76v-128h1536v1536h-128v-1408h-1408zM512 1460h128v128h128v-128h128v128h128v-128h128v128h128v-128h128 v256h128v-256h128v128h128v-128h128v128h128v256h-1536v-384z" />
+<glyph unicode="&#xf129;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-896h-384 q-53 0 -90.5 -37.5t-37.5 -90.5v-384h-896q-53 0 -90.5 37.5t-37.5 90.5zM1536 308h256l-128 -256z" />
+<glyph unicode="&#xf12a;" d="M0 564q0 -124 71.5 -222t184.5 -138v1000q0 159 112.5 271.5t271.5 112.5h1001q-40 113 -138.5 184.5t-222.5 71.5h-896q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM384 180q0 -159 112.5 -271.5t271.5 -112.5h896q159 0 271.5 112.5t112.5 271.5v896q0 159 -112.5 271.5 t-271.5 112.5h-896q-159 0 -271.5 -112.5t-112.5 -271.5v-896zM640 180v896q0 53 37.5 90.5t90.5 37.5h896q53 0 90.5 -37.5t37.5 -90.5v-512h-384q-53 0 -90.5 -37.5t-37.5 -90.5v-384h-512q-53 0 -90.5 37.5t-37.5 90.5zM1536 308h256l-128 -256z" />
+<glyph unicode="&#xf12b;" d="M0 52v-256h256v128h-128v128h-128zM0 1588h128v128h128v128h-256v-256zM256 52h1536v1536h-1536v-1536zM512 308v1024h1024v-1024h-1024zM640 436h170q-22 9 -49 38.5t-66.5 82.5t-54.5 71v-192zM640 1076q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM846 436h562v468q-29 33 -60.5 39.5t-62.5 -11t-63 -49.5t-64.5 -76t-64.5 -91t-64.5 -94.5t-62.5 -86t-61.5 -65.5t-58.5 -34zM1792 -76v-128h256v256h-128v-128h-128zM1792 1716h128v-128h128v256h-256v-128z" />
+<glyph unicode="&#xf12c;" d="M341 1161q0 -186 93.5 -342.5t250.5 -246.5q33 -47 68 -85q0 -1 -1 -4t-1 -4v-273q0 -57 40 -97t96 -40h274q56 0 96 40t40 97v273q0 1 -1 4t-1 4q35 38 68 85q157 90 250.5 246.5t93.5 342.5q0 185 -91.5 342.5t-249 249t-342.5 91.5t-342.5 -91.5t-249 -249 t-91.5 -342.5zM887 -136q0 -28 20.5 -48t48.5 -20h136q28 0 48.5 20t20.5 48t-20.5 48.5t-48.5 20.5h-136q-28 0 -48.5 -20.5t-20.5 -48.5z" />
+<glyph unicode="&#xf12d;" d="M384 1204q0 -209 128 -379v-5q8 -8 21 -23l3 -4q104 -124 104 -229v-128q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5t37.5 90.5v128q0 5 1 14.5t7.5 38.5t18.5 58t38.5 69t62.5 76q34 34 48 79q80 141 80 305q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5 t-248.5 50.5q-174 0 -321 -85.5t-233 -233t-86 -321.5zM640 1204q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5q0 -124 -71.5 -222t-184.5 -138v-152q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v151q-113 40 -184.5 138.5t-71.5 222.5zM768 116 q0 -26 19 -45t45 -19h384q26 0 45 19t19 45t-19 45t-45 19h-384q-26 0 -45 -19t-19 -45zM896 -141q0 -26 19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19h-128q-26 0 -45 -19t-19 -45z" />
+<glyph unicode="&#xf12e;" d="M384 436q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q174 0 321.5 86t233 233t85.5 321q0 99 -66 280.5t-160 370t-188 362.5t-160 285l-66 110q-26 -43 -69 -116t-153.5 -274t-195 -373t-153.5 -359t-69 -286zM640 436q0 20 7 58q25 -135 131 -224.5t246 -89.5 t246 89.5t131 224.5q7 -39 7 -58q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
+<glyph unicode="&#xf130;" d="M0 436q0 -159 112.5 -271.5t271.5 -112.5v-128q0 -53 37.5 -90.5t90.5 -37.5h1024q53 0 90.5 37.5t37.5 90.5v128q159 0 271.5 112.5t112.5 271.5v384q0 159 -112.5 271.5t-271.5 112.5v512q0 53 -37.5 90.5t-90.5 37.5h-1024q-53 0 -90.5 -37.5t-37.5 -90.5v-512 q-159 0 -271.5 -112.5t-112.5 -271.5v-384zM256 308v128q0 106 75 181t181 75h1024q106 0 181 -75t75 -181v-128h-128v128q0 53 -37.5 90.5t-90.5 37.5h-1024q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-128zM512 -76v512h1024v-512h-1024zM512 1204v512h1024v-512h-128v384h-768 v-384h-128zM768 1204v256h512v-256h-512zM1408 820v128h128v-128h-128zM1664 820v128h128v-128h-128z" />
+<glyph unicode="&#xf131;" d="M0 436q0 -53 37.5 -90.5t90.5 -37.5h128v128q0 106 75 181t181 75h1024q106 0 181 -75t75 -181v-128h128q53 0 90.5 37.5t37.5 90.5v768q0 53 -37.5 90.5t-90.5 37.5h-256v512h-1280v-512h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-768zM384 -204h128v512h128v-256h128v256 h128v-384h128v384h128v-512h128v512h128v-256h128v256h128v128q0 53 -37.5 90.5t-90.5 37.5h-1024q-53 0 -90.5 -37.5t-37.5 -90.5v-640zM512 1332v384h1024v-384h-1024zM1408 948v128h128v-128h-128zM1664 948v128h128v-128h-128z" />
+<glyph unicode="&#xf132;" d="M146 235q0 -120 117.5 -221t319.5 -159.5t441 -58.5t441 58.5t319.5 159.5t117.5 221q0 130 -147 242v343q0 223 -122.5 405.5t-321.5 267.5q6 28 6 58q0 121 -85.5 207t-207.5 86t-207.5 -86t-85.5 -207q0 -20 6 -58q-199 -85 -321.5 -267.5t-122.5 -405.5v-343 q-147 -112 -147 -242zM439 235q0 79 78.5 146.5t213 106.5t293.5 39t293.5 -39t213 -106.5t78.5 -146.5q0 -80 -78.5 -147.5t-213 -106.5t-293.5 -39t-293.5 39t-213 106.5t-78.5 147.5zM737 326q20 -102 100.5 -169.5t186.5 -67.5t186.5 67.5t100.5 169.5q-125 55 -287 55 t-287 -55z" />
+<glyph unicode="&#xf133;" d="M256 564q0 -104 103 -192.5t279.5 -140t385.5 -51.5t385.5 51.5t279.5 140t103 192.5q0 116 -128 212v172q0 195 -107.5 354.5t-281.5 234.5q5 27 5 51q0 106 -75 181t-181 75t-181 -75t-75 -181q0 -24 5 -51q-174 -75 -281.5 -234.5t-107.5 -354.5v-172 q-128 -96 -128 -212zM768 52q0 -106 75 -181t181 -75t181 75t75 181q0 7 -2 21q-142 -21 -254 -21t-254 21q0 -3 -1 -10t-1 -11z" />
+<glyph unicode="&#xf134;" d="M0 1605l214 207l1834 -1777l-214 -207zM118 235q0 131 151 242v343q0 133 53 266l583 -564q-137 -13 -247.5 -54t-174 -102t-63.5 -131q0 -80 80.5 -147.5t220 -106.5t303.5 -39q228 0 401 76l138 -134q-242 -88 -539 -88q-185 0 -352.5 34.5t-289 93.5t-193 140 t-71.5 171zM722 1551q0 122 88.5 207.5t213.5 85.5t213.5 -85.5t88.5 -207.5q0 -29 -6 -58q206 -85 332.5 -267.5t126.5 -405.5v-318l-1054 1022q0 3 -1 8.5t-1.5 10t-0.5 8.5zM728 326q128 55 296 55q5 0 14.5 -1t14.5 -1l194 -189q-93 -101 -223 -101q-110 0 -193 67.5 t-103 169.5z" />
+<glyph unicode="&#xf135;" d="M64 1581l1736 -1705l184 182l-1736 1705zM242 564q0 -104 104.5 -192.5t285 -140t392.5 -51.5q126 0 259 23l-895 879q-16 -78 -16 -134v-172q-130 -97 -130 -212zM699 1501l1069 -1050q38 59 38 113q0 115 -130 212v172q0 195 -109.5 354.5t-287.5 234.5q6 24 6 51 q0 106 -76.5 181t-184.5 75t-184.5 -75t-76.5 -181q0 -27 6 -51q-28 -11 -70 -36zM763 52q0 -106 76.5 -181.5t184.5 -75.5t184.5 75.5t76.5 181.5q0 4 -1 11t-1 10q-145 -21 -259 -21t-259 21q0 -3 -1 -10t-1 -11z" />
+<glyph unicode="&#xf136;" d="M0 52v-128l407 407q-23 53 -23 105q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75q-52 0 -105 23l-407 -407h128l1024 512l128 512h244q2 2 6 5t6 5l60 58l-635 635l-59 -59l-6 -8v-252l-512 -128zM1217 1651l636 -636l195 189l-640 640z" />
+<glyph unicode="&#xf137;" d="M0 -76v-64q0 -26 19 -45t45 -19t45 19t19 45v64q111 331 513 709q0 -1 -0.5 -2.5t-0.5 -2.5q0 -80 56 -136t136 -56t136 56t56 136q0 42 -24 88q46 -24 88 -24q80 0 136 56t56 136q0 42 -24 88q46 -24 88 -24q69 0 120 44t65 111q71 -27 135 -27q159 0 271.5 112.5 t112.5 271.5t-112.5 271.5t-271.5 112.5q-185 0 -360 -65.5t-315 -177t-268 -255.5t-225.5 -303t-180.5 -318t-140 -303t-97.5 -255.5t-59.5 -176.5z" />
+<glyph unicode="&#xf138;" d="M0 -76v-128h128l348 348q132 -92 292 -92q68 0 193 104t265 264.5t288 357.5t265.5 380.5t193 336.5t75.5 221v42.5t-2.5 31t-3.5 24t-10 14.5t-14.5 10t-24 3.5t-31 2.5h-42.5q-68 0 -221 -75.5t-336.5 -193t-380.5 -265.5t-357.5 -288t-264.5 -265t-104 -193 q0 -69 21 -140l1259 1036z" />
+<glyph unicode="&#xf139;" d="M0 -204l768 256l1280 1280l-512 512l-1280 -1280zM256 52l128 384l256 -256zM512 564l768 768l256 -256l-768 -768z" />
+<glyph unicode="&#xf13a;" d="M0 -204l499 139l1172 1170l-367 358l-1167 -1167zM1415 1573l367 -356l191 190q75 75 75 181t-75 181t-181 75t-181 -75z" />
+<glyph unicode="&#xf13b;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h492q-151 -113 -266 -256h-226q-53 0 -90.5 -37.5t-37.5 -90.5v-1280q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v653q134 27 256 118v-771q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5 t-112.5 271.5zM384 244v64q2 20 6 54t23.5 139t46.5 206.5t79 240t117 257t164.5 240t217 206.5t279.5 139t347 54q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5q-64 0 -135 27q-14 -67 -65 -111t-120 -44q-42 0 -88 24q24 -46 24 -88q0 -80 -56 -136 t-136 -56q-42 0 -88 24q24 -46 24 -88q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 1 0.5 2.5t0.5 2.5q-52 -64 -84 -145.5t-39 -130.5l-6 -49v-64q0 -26 -19 -45t-45 -19t-45 19t-19 45z" />
+<glyph unicode="&#xf13c;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h858q-211 -118 -390 -256h-468q-53 0 -90.5 -37.5t-37.5 -90.5v-1280q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v468q138 179 256 390v-858q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5 t-112.5 271.5zM384 180v128l1152 1152l-875 -652q-21 71 -21 140q0 68 75.5 164.5t193.5 194t265 195.5t288 173t265 122t193 47h42.5t31 -2.5t24 -3.5t14.5 -10t10 -14.5t3.5 -24t2.5 -31v-42.5q0 -69 -47 -193t-122 -265t-173 -288t-195.5 -265t-194 -193.5t-164.5 -75.5 q-160 0 -292 92l-348 -348h-128z" />
+<glyph unicode="&#xf13d;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h790l-256 -256h-534q-53 0 -90.5 -37.5t-37.5 -90.5v-1280q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v534l256 256v-790q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5z M384 180l256 768l896 896l512 -512l-896 -896zM640 436l384 128l-256 256zM896 948l256 -256l384 384l-256 256z" />
+<glyph unicode="&#xf13e;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h940l-257 -256h-683q-53 0 -90.5 -37.5t-37.5 -90.5v-1280q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v684l256 256v-940q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5z M384 180l137 501l783 781l367 -357l-788 -786zM1415 1573l196 196q75 75 181 75t181 -75t75 -181t-75 -181l-191 -191z" />
+<glyph unicode="&#xf140;" d="M774 820q0 -104 73 -177t177 -73t177 73t73 177t-73 177t-177 73t-177 -73t-73 -177z" />
+<glyph unicode="&#xf141;" d="M24 820q0 -104 73 -177t177 -73t177 73t73 177t-73 177t-177 73t-177 -73t-73 -177zM774 820q0 -104 73 -177t177 -73t177 73t73 177t-73 177t-177 73t-177 -73t-73 -177zM1524 820q0 -104 73 -177t177 -73t177 73t73 177t-73 177t-177 73t-177 -73t-73 -177z" />
+<glyph unicode="&#xf142;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM384 1140q0 -80 56 -136t136 -56q61 0 110 36t69 92h282q21 -57 69.5 -92.5t109.5 -35.5q80 0 136 56t56 136t-56 136t-136 56q-61 0 -109.5 -35.5t-69.5 -92.5h-282q-20 56 -69 92t-110 36 q-80 0 -136 -56t-56 -136zM512 1140q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM640 500q0 -80 56 -136t136 -56q61 0 110 36t69 92h282q21 -57 69.5 -92.5t109.5 -35.5q80 0 136 56t56 136t-56 136t-136 56q-61 0 -109.5 -35.5t-69.5 -92.5h-282 q-20 56 -69 92t-110 36q-80 0 -136 -56t-56 -136zM1408 500q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45z" />
+<glyph unicode="&#xf143;" d="M0 376q0 -158 112 -271l197 -197q113 -112 271.5 -112t270.5 112l173 189q87 87 106.5 208.5t-32.5 226.5l-435 -435q-37 -37 -90 -37t-91 37l-181 181q-37 38 -37 91t37 90l435 435q-105 52 -226.5 32.5t-208.5 -106.5l-189 -173q-112 -113 -112 -271zM626 549 q0 -53 37 -90t90 -37t90 37l543 542q37 37 37 90t-37 90q-38 37 -91 37t-90 -37l-542 -542q-37 -37 -37 -90zM917.5 1334.5q-19.5 -121.5 32.5 -226.5l436 435q37 37 89.5 37t90.5 -37l181 -181q37 -38 37 -90.5t-37 -89.5l-435 -436q105 -52 226.5 -32.5t208.5 106.5 l189 189q112 112 112 270.5t-112 271.5l-181 181q-113 112 -271 112t-271 -112l-189 -189q-87 -87 -106.5 -208.5z" />
+<glyph unicode="&#xf144;" d="M0 692q0 -159 112.5 -271.5t271.5 -112.5h128q124 0 222.5 71.5t138.5 184.5h-489q-53 0 -90.5 37.5t-37.5 90.5v256q0 53 37.5 90.5t90.5 37.5h489q-40 113 -138.5 184.5t-222.5 71.5h-128q-159 0 -271.5 -112.5t-112.5 -271.5v-256zM512 820q0 -53 37.5 -90.5 t90.5 -37.5h768q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-768q-53 0 -90.5 -37.5t-37.5 -90.5zM1176 564q40 -114 138.5 -185t221.5 -71h128q159 0 271.5 112.5t112.5 271.5v256q0 159 -112.5 271.5t-271.5 112.5h-128q-123 0 -221.5 -71t-138.5 -185h488 q53 0 90.5 -37.5t37.5 -90.5v-256q0 -53 -37.5 -90.5t-90.5 -37.5h-488z" />
+<glyph unicode="&#xf145;" d="M0 820q0 -167 52 -323.5t147 -282.5t221 -221t282 -146.5t322 -51.5q167 0 323.5 51.5t282 146.5t220.5 221t146.5 282.5t51.5 323.5v256l-512 -512h211q-69 -195 -228.5 -329.5t-366.5 -169.5v627h128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-128v151 q113 40 184.5 138.5t71.5 222.5q0 144 -95.5 251.5t-236.5 127.5q-28 5 -52 5t-52 -5q-141 -20 -236.5 -127.5t-95.5 -251.5q0 -124 71.5 -222t184.5 -138v-152h-128q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5h128v-627q-207 35 -366.5 169.5t-228.5 329.5h211 l-512 512v-256zM896 1460q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf146;" d="M111.5 502q-27.5 -103 25.5 -194q53 -92 155.5 -119t194.5 25q54 32 164 123t202 186q-37 -128 -61 -268.5t-24 -202.5q0 -106 75 -181t181 -75t181 75t75 181q0 62 -24 202.5t-61 268.5q94 -96 203.5 -187t162.5 -122q92 -52 194.5 -25t155.5 119q53 91 25.5 194 t-119.5 156q-55 31 -188.5 80.5t-261.5 81.5q129 33 262.5 82t187.5 80q92 53 119.5 156t-25.5 194q-53 92 -155.5 119.5t-194.5 -25.5q-53 -31 -162.5 -122t-203.5 -187q37 128 61 268.5t24 202.5q0 106 -75 181t-181 75t-181 -75t-75 -181q0 -62 24 -202.5t61 -268.5 q-92 95 -202 186t-164 123q-92 53 -194.5 25.5t-155.5 -119.5q-53 -91 -25.5 -194t119.5 -156q54 -31 187.5 -80t262.5 -82q-128 -32 -261.5 -81.5t-188.5 -80.5q-92 -53 -119.5 -156z" />
+<glyph unicode="&#xf147;" d="M0 820q0 -208 81 -397.5t218 -327t327 -218.5t398 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81t-398.5 -81t-326.5 -218t-218 -326.5t-81 -398.5zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM642.5 621q-27.5 -108 19.5 -163q55 -47 163 -19.5t217 87t163 113.5t113.5 163t87 217t-19.5 163q-55 47 -163 19.5t-217 -87t-163 -113.5t-113.5 -163t-87 -217zM934 911 q55 55 192 134.5t170 46.5t-46.5 -170t-134.5 -192z" />
+<glyph unicode="&#xf148;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM642.5 973q7.5 38 35.5 66l256 256q37 37 90 37q54 0 91 -37l256 -256q27 -28 34.5 -66t-7.5 -74q-14 -36 -46.5 -57.5t-71.5 -21.5h-128v-384q0 -53 -37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5v384h-128q-39 0 -71 21.5t-47 57.5t-7.5 74z" />
+<glyph unicode="&#xf149;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM642.5 667q-7.5 38 7.5 74t47 57.5t71 21.5h128v384q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-384h128q39 0 71.5 -21.5t46.5 -57.5q15 -36 7.5 -74t-34.5 -66 l-256 -256q-37 -37 -91 -37q-53 0 -90 37l-256 256q-28 28 -35.5 66z" />
+<glyph unicode="&#xf14a;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM512 820q0 54 37 91l256 256q28 27 66 34.5t74 -7.5q36 -14 57.5 -46.5t21.5 -71.5v-128h384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-384v-128 q0 -38 -21.5 -70.5t-57.5 -47.5t-74 -7.5t-66 35.5l-256 256q-37 37 -37 90z" />
+<glyph unicode="&#xf14b;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM512 820q0 53 37.5 90.5t90.5 37.5h384v128q0 39 21.5 71t57.5 47t74 7.5t66 -34.5l256 -256q37 -37 37 -91q0 -53 -37 -90l-256 -256q-28 -28 -66 -35.5t-74 7.5 q-36 14 -57.5 46.5t-21.5 71.5v128h-384q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf14c;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 820q0 -53 37.5 -90.5t90.5 -37.5h256v-256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v256h256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-256 v256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-256h-256q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf14d;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 820q0 -53 37.5 -90.5t90.5 -37.5h768q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-768q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf14e;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 549q0 -53 38 -91t91 -38t90 38l181 181l181 -181q37 -38 90 -38t91 38t38 91t-38 90l-181 181l181 181q38 37 38 90t-38 91t-91 38t-90 -38l-181 -181l-181 181 q-37 38 -90 38t-91 -38t-38 -91t38 -90l181 -181l-181 -181q-38 -37 -38 -90z" />
+<glyph unicode="&#xf150;" d="M0 948l305 -229l1359 741l-1024 -1024v-640l384 384l512 -384l512 2048z" />
+<glyph unicode="&#xf151;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5v-384q0 -159 -112.5 -271.5t-271.5 -112.5q-144 0 -251 94.5t-127 235.5q-124 -74 -262 -74q-139 0 -257 68.5t-186.5 186.5t-68.5 257q0 212 150 362t362 150t362 -150 t150 -362v-384q0 -52 38 -90t90 -38q53 0 90.5 37.5t37.5 90.5v384q0 209 -103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5t103 -385.5t279.5 -279.5t385.5 -103h128q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-128q-208 0 -397.5 81 t-327 218.5t-218.5 327t-81 397.5zM768 820q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="&#xf152;" d="M0 436q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v768q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-768zM256 564v512l768 -512l768 512v-511l-384 128l347 -347q-38 -38 -91 -38h-1280q-54 0 -90 38 l346 346zM303 1301q36 31 81 31h1280q45 0 81 -31l-721 -481z" />
+<glyph unicode="&#xf153;" d="M0 181v768q0 159 112.5 271.5t271.5 112.5h23l6 -19q36 -86 86.5 -138t140.5 -77v-22h-256q-43 0 -81 -31l721 -481l721 481q-38 31 -81 31h-256v22q90 25 140.5 77t86.5 138l6 19h23q159 0 271.5 -112.5t112.5 -271.5v-768q0 -159 -112.5 -271.5t-271.5 -112.5h-1280 q-159 0 -271.5 112.5t-112.5 271.5zM256 310l384 128l-346 -347q36 -38 90 -38h1280q53 0 91 38l-347 346l384 -128v513l-768 -512l-768 512v-512zM642.5 1485q7.5 38 35.5 66l256 256q37 37 90 37q54 0 91 -37l256 -256q27 -28 34.5 -66t-7.5 -74q-14 -36 -46.5 -57.5 t-71.5 -21.5h-128v-384q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v384h-128q-39 0 -71 21.5t-47 57.5t-7.5 74z" />
+<glyph unicode="&#xf154;" d="M0 180v768q0 159 112.5 271.5t271.5 112.5h23q-46 -130 -1 -256h-22q-43 0 -81 -31l721 -481l721 481q-38 31 -81 31h-22q45 126 -1 256h23q159 0 271.5 -112.5t112.5 -271.5v-768q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 308 l384 128l-346 -346q36 -38 90 -38h1280q52 0 91 37l-347 347l384 -128v512l-768 -512l-768 512v-512zM642.5 1179q-7.5 38 7.5 74t47 57.5t71 21.5h128v384q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-384h128q39 0 71.5 -22t46.5 -57q15 -36 7.5 -74t-34.5 -66 l-256 -256q-37 -37 -91 -37q-53 0 -90 37l-256 256q-28 28 -35.5 66z" />
+<glyph unicode="&#xf155;" d="M128 1332q0 -53 37.5 -90.5t90.5 -37.5v-1024q0 -159 112.5 -271.5t271.5 -112.5h768q159 0 271.5 112.5t112.5 271.5v1024q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-384q0 159 -113.5 271.5t-270.5 112.5q-159 0 -271.5 -112.5t-112.5 -271.5h-384 q-53 0 -90.5 -37.5t-37.5 -90.5zM512 180v1024h1024v-1024q0 -53 -37.5 -90.5t-90.5 -37.5h-768q-53 0 -90.5 37.5t-37.5 90.5zM768 372q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512zM896 1460q0 53 37.5 90.5t90.5 37.5t90.5 -37.5 t37.5 -90.5h-256zM1152 372q0 -26 19 -45t45 -19t45 19t19 45v512q0 26 -19 45t-45 19t-45 -19t-19 -45v-512z" />
+<glyph unicode="&#xf156;" d="M0 180v480l256 -192v-288q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5t-90.5 37.5h-512q0 137 -69 256h581q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5z M0 1205q0 64 51 102l512 384q35 26 77 26q32 0 57 -14q33 -16 52 -47t19 -67v-128q182 0 348 -71t286 -191t191 -286t71 -348q0 -133 -38 -256q-84 281 -320.5 460.5t-537.5 179.5v-128q0 -37 -19 -68t-52 -47q-28 -14 -57 -14q-42 0 -77 26l-512 385q-51 38 -51 102z" />
+<glyph unicode="&#xf157;" d="M0 820q0 69 57 107l768 512q29 19 64.5 21t66.5 -15q42 -22 59 -68l-517 -344q-53 -36 -83.5 -92.5t-30.5 -120.5t30.5 -120.5t83.5 -92.5l517 -344q-17 -46 -59 -68q-31 -17 -66.5 -15t-64.5 22l-768 512q-57 36 -57 106zM512 821q0 69 57 107l768 511q29 19 64.5 21 t66.5 -15q32 -17 50 -47t18 -66v-255q212 0 362 -150t150 -362q0 -133 -71 -256q-68 117 -185 186.5t-256 69.5v-256q0 -35 -18 -65.5t-50 -47.5q-31 -17 -66.5 -15t-64.5 22l-768 512q-57 36 -57 106z" />
+<glyph unicode="&#xf158;" d="M224 877q0 -62 51 -95l686 -457q26 -18 57.5 -19.5t59.5 13.5t44 42t16 59v229q221 0 398 -127.5t248 -330.5q40 115 40 229q0 186 -92 344t-250 250t-344 92v228q0 32 -16 59t-44 42t-59.5 13.5t-57.5 -19.5l-686 -457q-51 -33 -51 -95z" />
+<glyph unicode="&#xf159;" d="M0 308v640q0 159 112.5 271.5t271.5 112.5h97q-99 -123 -156 -272q-31 -17 -50 -46.5t-19 -65.5v-640q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v320l256 192v-512q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5z M512 692q0 209 103 385.5t279.5 279.5t385.5 103v128q0 36 19 67t52 47q25 14 57 14q42 0 77 -26l512 -384q51 -38 51 -102q0 -65 -51 -102l-512 -384q-33 -26 -77 -26q-28 0 -57 13q-33 16 -52 47t-19 68v128q-247 0 -445 -142.5t-278 -369.5q-45 124 -45 256z" />
+<glyph unicode="&#xf15a;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM768 1204q0 -63 32 -191t64 -225l32 -96q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5l128 512q0 106 -75 181t-181 75t-181 -75t-75 -181zM896 308 q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf15b;" d="M681 1277q0 142 100.5 242.5t242.5 100.5t242.5 -100.5t100.5 -242.5q0 -15 -4 -28l-111 -445q-6 -90 -72 -151.5t-156 -61.5q-89 0 -154 60t-73 147q-21 61 -44 134.5t-47.5 179.5t-24.5 165zM795 249q0 94 67 161t162 67t162 -67t67 -161q0 -95 -67.5 -162t-161.5 -67 t-161.5 67t-67.5 162z" />
+<glyph unicode="&#xf15c;" d="M0 820q0 208 81 398t218.5 327t327 218t397.5 81q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM256 820q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103 t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM415 1018l421 61l188 381l188 -381l421 -61l-305 -297l72 -419l-376 198l-376 -198l72 419z" />
+<glyph unicode="&#xf15d;" d="M224 1000l400 -390l-94 -551l494 260l494 -260l-94 551l400 390l-553 80l-247 501l-247 -501z" />
+<glyph unicode="&#xf15e;" d="M0 -76q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v1792q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-1792zM384 692h640v-256h1024l-256 512l256 512h-768v256h-896v-1024zM640 948v512h384v-512h-384zM1280 692v512h354l-128 -256l128 -256h-354z" />
+<glyph unicode="&#xf160;" d="M0 -76q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v1792q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-1792zM384 692h640v-256h1024l-256 512l256 512h-768v256h-896v-1024z" />
+<glyph unicode="&#xf161;" d="M0 820h256l768 878l768 -878h256l-896 1024h-256zM256 -204h512v640q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5v-640h512v859l-768 848l-768 -848v-859zM1664 1453l256 -292v555h-256v-263z" />
+<glyph unicode="&#xf162;" d="M0 948l128 -128h256v-896q0 -53 37.5 -90.5t90.5 -37.5h256v768q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5v-768h256q53 0 90.5 37.5t37.5 90.5v896h256l128 128l-1024 896z" />
+<glyph unicode="&#xf163;" d="M0 948l128 -128h256v-896q0 -53 37.5 -90.5t90.5 -37.5h256v512q0 53 37.5 90.5t90.5 37.5h256q53 0 90.5 -37.5t37.5 -90.5v-512h256q53 0 90.5 37.5t37.5 90.5v896h256l128 128l-1024 896zM768 948q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75 t-75 181z" />
+<glyph unicode="&#xf164;" d="M0 180v1280q0 159 112.5 271.5t271.5 112.5h1280q159 0 271.5 -112.5t112.5 -271.5v-1280q0 -159 -112.5 -271.5t-271.5 -112.5h-1280q-159 0 -271.5 112.5t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5v1280q0 53 -37.5 90.5 t-90.5 37.5h-1280q-53 0 -90.5 -37.5t-37.5 -90.5v-1280zM486 821q0 53 38 90t91 37t90 -37l181 -181l453 452q37 38 90 38t91 -38t38 -91t-38 -90l-543 -543q-37 -38 -90 -38t-91 38l-272 272q-38 38 -38 91z" />
+<glyph unicode="&#xf165;" d="M0 180q0 -159 112.5 -271.5t271.5 -112.5h1280q159 0 271.5 112.5t112.5 271.5v1280q0 159 -112.5 271.5t-271.5 112.5h-1280q-159 0 -271.5 -112.5t-112.5 -271.5v-1280zM256 180v1280q0 53 37.5 90.5t90.5 37.5h1280q53 0 90.5 -37.5t37.5 -90.5v-1280 q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5zM624 549q0 -53 38 -91t91 -38t90 38l181 181l181 -181q37 -38 90 -38t91 38t38 91t-38 90l-181 181l181 181q38 37 38 90t-38 91t-91 38t-90 -38l-181 -181l-181 181q-37 38 -90 38t-91 -38t-38 -91 t38 -90l181 -181l-181 -181q-38 -37 -38 -90z" />
+<glyph unicode="&#xf166;" d="M0 1396q0 -118 63 -225q77 212 237.5 372.5t372.5 237.5q-107 63 -225 63q-185 0 -316.5 -131.5t-131.5 -316.5zM128 821q0 -179 67.5 -340.5t188.5 -285.5v-271q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v90q188 -90 384 -90t384 90v-90q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5v271q121 123 188.5 284.5t67.5 341.5q0 182 -71 348t-191 286t-286 191t-348 71t-348 -71t-286 -191t-191 -286t-71 -348zM384 821q0 130 51 248.5t136.5 204t204 136.5t248.5 51q174 0 321.5 -86t233 -233t85.5 -321q0 -130 -50.5 -248.5 t-136.5 -204.5t-204.5 -136.5t-248.5 -50.5q-174 0 -321 85.5t-233 233t-86 321.5zM896 821q0 -53 37.5 -90.5t90.5 -37.5h256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-128v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-256zM1375 1781 q212 -77 372.5 -237.5t237.5 -372.5q63 107 63 225q0 185 -131 316.5t-317 131.5q-118 0 -225 -63z" />
+<glyph unicode="&#xf167;" d="M256 564q0 -209 103 -385.5t279.5 -279.5t385.5 -103t385.5 103t279.5 279.5t103 385.5t-103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5zM512 564q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362z M768 1588q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM896 564q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 32 -32 128t-64 176l-32 80q-128 -313 -128 -384zM896 1588q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf168;" d="M253 307q0 -53 38 -91t91 -38h257q53 0 90.5 38t37.5 91v1027q0 53 -37.5 91t-90.5 38h-257q-53 0 -91 -38t-38 -91v-1027zM767 821q0 -32 15.5 -61t41.5 -46l771 -514q63 -43 132 -7q32 17 50 47.5t18 66.5v1027q0 36 -18 66.5t-50 47.5q-32 16 -67.5 14.5t-64.5 -21.5 l-771 -514q-57 -37 -57 -106z" />
+<glyph unicode="&#xf169;" d="M0 820q0 -70 57 -106l768 -512q29 -20 64.5 -22t66.5 15q32 17 50 47.5t18 65.5v1024q0 35 -18.5 66t-49.5 47q-31 17 -66.5 15t-64.5 -21l-768 -512q-57 -38 -57 -107zM1024 820q0 -70 57 -106l768 -512q29 -20 64.5 -22t66.5 15q32 17 50 47.5t18 65.5v1024 q0 35 -18.5 66t-49.5 47q-31 17 -66.5 15t-64.5 -21l-768 -512q-57 -38 -57 -107z" />
+<glyph unicode="&#xf16a;" d="M378 303q0 -53 38 -91t91 -38h1034q53 0 91 38t38 91v1034q0 53 -38 91t-91 38h-1034q-53 0 -91 -38t-38 -91v-1034z" />
+<glyph unicode="&#xf16b;" d="M378 303q0 -71 61 -110q31 -19 68 -19q30 0 58 14l1034 516q32 17 51.5 48t19.5 68t-19.5 68t-51.5 48l-1034 516q-28 14 -58 14q-35 0 -68 -19q-61 -39 -61 -110v-1034z" />
+<glyph unicode="&#xf16c;" d="M378 303q0 -53 38 -91t91 -38h259q53 0 91 38t38 91v1034q0 53 -38 91t-91 38h-259q-53 0 -91 -38t-38 -91v-1034zM1153 303q0 -53 38 -91t91 -38h259q53 0 91 38t38 91v1034q0 53 -38 91t-91 38h-259q-53 0 -91 -38t-38 -91v-1034z" />
+<glyph unicode="&#xf16d;" d="M0 308q0 -35 18.5 -66t49.5 -47q31 -17 66.5 -15t64.5 21l768 512q57 38 57 107q0 70 -57 106l-768 512q-29 20 -64.5 22t-66.5 -15q-32 -17 -50 -47.5t-18 -65.5v-1024zM1024 308q0 -35 18.5 -66t49.5 -47q31 -17 66.5 -15t64.5 21l768 512q57 38 57 107q0 70 -57 106 l-768 512q-29 20 -64.5 22t-66.5 -15q-32 -17 -50 -47.5t-18 -65.5v-1024z" />
+<glyph unicode="&#xf16e;" d="M253 306q0 -35 18.5 -66t49.5 -47q31 -17 67 -15t65 21l771 514q57 39 57 107t-57 107l-771 514q-29 19 -65 21t-67 -15q-31 -16 -49.5 -47t-18.5 -66v-1028zM1281 306q0 -53 37.5 -90.5t90.5 -37.5h257q53 0 91 37.5t38 90.5v1028q0 53 -38 90.5t-91 37.5h-257 q-53 0 -90.5 -37.5t-37.5 -90.5v-1028z" />
+<glyph unicode="&#xf170;" d="M256 52q0 -53 37.5 -90.5t90.5 -37.5h1280q53 0 90.5 37.5t37.5 90.5q0 93 -42.5 186.5t-113 169.5t-159.5 136.5t-185 96.5q112 70 178 185t66 250v128q0 212 -150 362t-362 150t-362 -150t-150 -362v-128q0 -135 66 -250t178 -185q-96 -36 -185 -96.5t-159.5 -136.5 t-113 -169.5t-42.5 -186.5z" />
+<glyph unicode="&#xf171;" d="M128 52q0 -53 37.5 -90.5t90.5 -37.5h896v22q-113 40 -184.5 139t-71.5 223q0 129 77 229.5t197 136.5q24 78 78 138.5t128 95.5q32 89 32 168v128q0 212 -150 362t-362 150t-362 -150t-150 -362v-128q0 -135 66 -250t178 -185q-96 -36 -185 -96.5t-159.5 -136.5 t-113 -169.5t-42.5 -186.5zM1152 308q0 -53 37.5 -90.5t90.5 -37.5h128v-128q0 -54 37.5 -91.5t90.5 -37.5t90.5 37.5t37.5 91.5v128h128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-128v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-128h-128 q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf172;" d="M128 52q0 -53 37.5 -90.5t90.5 -37.5h1024q-159 0 -271.5 112.5t-112.5 271.5q0 142 92.5 249t230.5 129q88 73 138.5 173.5t50.5 216.5v128q0 212 -150 362t-362 150t-362 -150t-150 -362v-128q0 -135 66 -250t178 -185q-96 -36 -185 -96.5t-159.5 -136.5t-113 -169.5 t-42.5 -186.5zM1152 308q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf173;" d="M128 180q0 -159 112.5 -271.5t271.5 -112.5h640v151q-81 30 -151 105h-489q-53 0 -90.5 37.5t-37.5 90.5q43 166 188.5 275t323.5 109q48 0 93 -9q75 88 181 119q24 80 78.5 142t130.5 97q29 82 29 163v256q0 212 -150 362t-362 150t-362 -150t-150 -362v-256 q0 -203 142 -353q-154 -86 -261.5 -228.5t-136.5 -314.5zM640 1076v256q0 106 75 181t181 75t181 -75t75 -181v-256q0 -106 -75 -181t-181 -75t-181 75t-75 181zM1152 308q0 -53 37.5 -90.5t90.5 -37.5h128v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h128 q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-128v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-128h-128q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf174;" d="M128 180q0 -159 112.5 -271.5t271.5 -112.5h768q83 0 156.5 34t127.5 94h-284q-83 0 -156.5 34t-127.5 94h-484q-53 0 -90.5 37.5t-37.5 90.5q43 166 188.5 275t323.5 109q46 0 93 -9q54 64 129.5 100.5t161.5 36.5h30q-5 3 -20 14.5t-24 16.5q142 150 142 353v256 q0 212 -150 362t-362 150t-362 -150t-150 -362v-256q0 -203 142 -353q-154 -86 -261.5 -228.5t-136.5 -314.5zM640 1076v256q0 106 75 181t181 75t181 -75t75 -181v-256q0 -106 -75 -181t-181 -75t-181 75t-75 181zM1152 308q0 -53 37.5 -90.5t90.5 -37.5h512 q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf175;" d="M128 179q0 124 71.5 222.5t184.5 138.5v559q-113 40 -184.5 138.5t-71.5 222.5q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5q0 -124 -71.5 -222.5t-184.5 -138.5v-303q64 24 128 24h512q53 0 90.5 37.5t37.5 90.5v22q-113 40 -184.5 138.5t-71.5 222.5 q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5q0 -124 -71.5 -222t-184.5 -138v-24q0 -159 -112.5 -271.5t-271.5 -112.5h-512q-55 0 -92 -39q99 -47 159.5 -139.5t60.5 -205.5q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM384 179 q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM384 1459q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 1331q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf176;" d="M0 180q0 124 71.5 222.5t184.5 138.5v559q-113 40 -184.5 138.5t-71.5 222.5q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5q0 -124 -71.5 -222.5t-184.5 -138.5v-559q113 -40 184.5 -138.5t71.5 -222.5q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5 t-112.5 271.5zM256 180q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM256 1460q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 1460q0 52 38 90l256 256 q27 28 65 35.5t74 -7.5q36 -14 57.5 -46.5t21.5 -71.5v-128q159 0 271.5 -112.5t112.5 -271.5v-663q113 -40 184.5 -138.5t71.5 -222.5q0 -160 -112.5 -272.5t-271.5 -112.5t-271.5 112.5t-112.5 272.5q0 124 71.5 222t184.5 138v664q0 53 -37.5 90.5t-90.5 37.5v-128 q0 -39 -21.5 -71t-57.5 -47t-74 -7.5t-65 34.5l-256 257q-38 38 -38 90zM1536 180q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf177;" d="M0 820q0 -53 37.5 -90.5t90.5 -37.5h536q40 -114 138.5 -185t221.5 -71q124 0 222.5 71.5t138.5 184.5h535q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-535q-40 113 -138.5 184.5t-222.5 71.5q-123 0 -221.5 -71t-138.5 -185h-536q-53 0 -90.5 -37.5t-37.5 -90.5z M896 820q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf178;" d="M0 820q3 -10 9.5 -27t31 -69.5t54 -103.5t79.5 -120t106.5 -128.5t136.5 -120t168 -103t202 -69.5t237 -27t237 26.5t202.5 70.5t167.5 102t136.5 121.5t106 127t80 121.5t53.5 102t31 71l10 26q-3 10 -9.5 27t-31 69.5t-54 103.5t-79.5 120t-106.5 128.5t-136.5 120 t-168 103t-202 69.5t-237 27t-237 -26.5t-202.5 -70.5t-167.5 -102t-136.5 -121.5t-106 -127t-80 -121.5t-53.5 -102t-31 -71zM512 820q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM768 820q0 -106 75 -181t181 -75t181 75t75 181 t-75 181t-181 75q-2 0 -6 -0.5t-7 -0.5q13 -37 13 -63q0 -80 -56 -136t-136 -56q-26 0 -63 13q0 -3 -0.5 -7t-0.5 -6z" />
+<glyph unicode="&#xf179;" d="M0 692q3 -10 9.5 -27t31 -69.5t54 -103.5t79.5 -120t106.5 -128.5t136.5 -120t168 -103t202 -69.5t237 -27t237 26.5t202.5 70.5t167.5 102t136.5 121.5t106 127t80 121.5t53.5 102t31 71l10 26q-23 67 -74 161q-53 -74 -134 -117.5t-176 -43.5q-66 0 -130 24q0 -4 1 -12 t1 -12q0 -212 -150 -362t-362 -150t-362 150t-150 362t150 362t362 150q4 0 12 -1t12 -1q-24 64 -24 130q0 64 22 127q-4 0 -11 0.5t-11 0.5q-123 0 -237 -26.5t-202.5 -70.5t-167.5 -102t-136.5 -121.5t-106 -127t-80 -121.5t-53.5 -102t-31 -71zM768 692q0 -106 75 -181 t181 -75t181 75t75 181t-75 181t-181 75q-2 0 -6 -0.5t-7 -0.5q13 -37 13 -63q0 -80 -56 -136t-136 -56q-26 0 -63 13q0 -3 -0.5 -7t-0.5 -6zM1280 1332q0 -53 37.5 -90.5t90.5 -37.5h128v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h128q53 0 90.5 37.5 t37.5 90.5t-37.5 90.5t-90.5 37.5h-128v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-128h-128q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf17a;" d="M0 820q3 -10 9.5 -27t31 -69.5t54 -103.5t79.5 -120t106.5 -128.5t136.5 -120t168 -103t202 -69.5t237 -27t237 26.5t202.5 70.5t167.5 102t136.5 121.5t106 127t80 121.5t53.5 102t31 71l10 26q-39 115 -130 256h-453q71 -123 71 -256q0 -212 -150 -362t-362 -150 t-362 150t-150 362q0 139 68.5 257t186.5 186.5t257 68.5l24 -3q-24 67 -24 131q0 61 23 127q-4 0 -11.5 0.5t-11.5 0.5q-123 0 -237 -26.5t-202.5 -70.5t-167.5 -102t-136.5 -121.5t-106 -127t-80 -121.5t-53.5 -102t-31 -71zM768 820q0 -106 75 -181t181 -75t181 75 t75 181t-75 181t-181 75q-2 0 -6 -0.5t-7 -0.5q13 -37 13 -63q0 -80 -56 -136t-136 -56q-26 0 -63 13q0 -3 -0.5 -7t-0.5 -6zM1280 1460q0 -53 37.5 -90.5t90.5 -37.5h512q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf17b;" d="M0 820q0 -208 81 -397.5t218.5 -327t327 -218.5t397.5 -81t398 81t327 218.5t218 327t81 397.5q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81q-208 0 -397.5 -81t-327 -218t-218.5 -327t-81 -398zM256 820q0 53 37.5 90.5t90.5 37.5h146q16 64 54 131l-103 103 q-37 38 -37 91t37 90t90 37t91 -37l103 -103q66 37 131 54v146q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-146q64 -16 131 -54l103 103q38 37 91 37t90 -37t37 -90t-37 -91l-103 -103q38 -67 54 -131h146q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-146 q-17 -65 -54 -131l103 -103q37 -38 37 -91t-37 -90t-90 -37t-91 37l-103 103q-67 -38 -131 -54v-146q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v146q-65 17 -131 54l-103 -103q-38 -37 -91 -37t-90 37t-37 90t37 91l103 103q-37 66 -54 131h-146 q-53 0 -90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf17c;" d="M2.5 795q7.5 -38 34.5 -65l256 -256q38 -38 91 -38q52 0 90 38l257 255q27 28 34.5 66t-7.5 74q-14 36 -46.5 57.5t-71.5 21.5h-115q45 221 220.5 366.5t406.5 145.5q174 0 321.5 -86t233 -233t85.5 -321t-85.5 -321t-233 -233t-321.5 -86q-148 0 -277.5 64.5 t-219.5 177.5l-181 -167q-1 -1 -3 -2.5t-4.5 -3t-3.5 -2.5q126 -151 305.5 -237.5t383.5 -86.5q182 0 348 71t286 191t191 286.5t71 348.5t-71 348t-191 286t-286 191t-348 71q-166 0 -319.5 -59.5t-270 -161.5t-195 -244t-101.5 -303h-138q-39 0 -71.5 -21.5t-46.5 -57.5 q-15 -36 -7.5 -74zM1024 820q0 -53 37.5 -90.5t90.5 -37.5h256q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5h-128v128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-256z" />
+</font>
+</defs></svg> 
\ No newline at end of file
Binary file Resources/font/batch/batch.ttf has changed
Binary file Resources/font/batch/batch.woff has changed
Binary file Resources/font/exo/exo-bold.eot has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/font/exo/exo-bold.svg	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,524 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="exoextrabolditalic" horiz-adv-x="1363" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="512" />
+<glyph unicode="&#xfb01;" horiz-adv-x="1241" d="M83 844l34 209l166 34l24 118q29 188 165 294t354 111q99 2 273.5 -14t227.5 -41l-32 -195l-383 7q-248 5 -285 -223l-9 -57l698 -20l-169 -1067h-337l134 844h-365l-134 -844h-335l133 844h-160z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="1413" d="M159 844l34 208l167 35l18 94q17 106 53 184t82 124.5t111 74t127.5 36.5t142.5 9l614 -5l-183 -1155q-9 -57 -9.5 -94.5t9 -59t21.5 -31.5t34 -20q98 -42 109 -42l-32 -202h-201q-73 0 -128.5 20t-97 65.5t-53 119.5t2.5 182l155 977l-236 2q-87 0 -131.5 -44 t-62.5 -156l-9 -79h235l-39 -243h-235l-136 -844h-336l136 844h-162z" />
+<glyph horiz-adv-x="0" />
+<glyph unicode="&#xd;" horiz-adv-x="2048" />
+<glyph unicode=" "  horiz-adv-x="512" />
+<glyph unicode="&#x09;" horiz-adv-x="512" />
+<glyph unicode="&#xa0;" horiz-adv-x="512" />
+<glyph unicode="!" horiz-adv-x="561" d="M131 47l34 209q7 51 57 51h205q22 0 32 -14t7 -37l-34 -209q-6 -47 -53 -47h-205q-22 0 -34 13t-9 34zM207 403l142 1094h328l-207 -1094h-263z" />
+<glyph unicode="&#x22;" horiz-adv-x="958" d="M313 1087l19 275l23 137h321l-23 -137l-63 -275h-277zM714 1087l22 275l23 137h321l-23 -137l-63 -275h-280z" />
+<glyph unicode="#" horiz-adv-x="1501" d="M92 414l71 229h307l71 215h-310l74 229h317l142 412h229l-142 -412h221l139 412h230l-140 -412h347l-71 -229h-348l-71 -217h348l-68 -229h-367l-141 -412h-229l141 412l-222 2l-141 -414h-229l141 414h-299zM699 643l229 -2l71 217h-228z" />
+<glyph unicode="$" horiz-adv-x="1163" d="M130 49l42 259q267 -20 471 -20q156 0 174 110l8 59q10 63 -8.5 90.5t-96.5 27.5h-159q-75 0 -133.5 19.5t-94 50t-59 74t-33.5 84t-13 87.5t-0.5 78t6.5 61l17 127q13 85 45 148.5t74 101.5t102 61.5t117.5 32.5t132.5 11l27 177h196l-27 -178q179 -9 346 -62l-42 -261 q-222 20 -443 20q-97 2 -140 -21.5t-56 -100.5l-9 -50q-11 -67 13.5 -95.5t113.5 -28.5h165q73 0 129.5 -21.5t90 -59t55 -83t28.5 -98.5t6 -99t-8 -91l-13 -86q-16 -101 -52.5 -174t-80.5 -114t-106 -64.5t-115.5 -30t-123.5 -6.5l-27 -168h-195l27 170q-117 3 -181.5 16 t-169.5 47z" />
+<glyph unicode="%" horiz-adv-x="1976" d="M212 1009l39 242q21 132 93.5 190t228.5 58h207q142 0 198 -76t35 -214l-39 -241q-21 -135 -94 -194t-227 -59h-207q-138 0 -196.5 79.5t-37.5 214.5zM409 0l1159 1499h227l-1149 -1499h-237zM445 1032q-7 -48 7 -70t67 -22h130q56 0 78.5 22t29.5 70l23 150 q9 56 -6.5 74t-67.5 18h-131q-50 0 -74.5 -19t-32.5 -73zM1205 291l37 242q21 134 93 195t227 61h208q141 0 197 -77.5t36 -216.5l-35 -242q-21 -134 -95.5 -191t-229.5 -57h-208q-138 0 -194.5 75.5t-35.5 210.5zM1436 322q-7 -48 7 -70t67 -22h129q56 0 78.5 22t29.5 70 l23 150q9 56 -6.5 74t-67.5 18h-129q-50 0 -75 -19t-33 -73z" />
+<glyph unicode="&#x26;" horiz-adv-x="1411" d="M115 476.5q38 149.5 201 271.5l182 137l-74 131q-61 115 -40.5 217t94 174.5t164.5 86.5q88 14 172 15.5t163.5 -8t134 -20t127.5 -27.5l-40 -246h-308q-122 0 -143 -36t40 -146l235 -412l281 238l98 -145l-144 -251l-94 -89l211 -367h-371l-104 181l-155 -120 q-73 -57 -181 -72t-220.5 31t-175.5 154q-91 153 -53 302.5zM440 357q23 -36 54 -53.5t71 -11.5t80 39l109 90l-129 216l-118 -85q-129 -100 -67 -195z" />
+<glyph unicode="'" horiz-adv-x="487" d="M270 1087l21 275l22 137h338l-22 -137l-64 -275h-295z" />
+<glyph unicode="(" horiz-adv-x="802" d="M180.5 317q2.5 148 27.5 305q24 147 66.5 283.5t92 238.5t103.5 191t103.5 148.5t89.5 103t63 63.5l24 19h308q-9 -10 -24 -29t-60 -82.5t-87.5 -130.5t-97.5 -169t-99.5 -203.5t-85 -229t-60.5 -250.5q-30 -195 -24.5 -362.5t36 -303.5t65 -231.5t61.5 -147.5l28 -52 h-304q-7 8 -18 23t-42 69.5t-57.5 116.5t-54 163t-42 210t-12 257z" />
+<glyph unicode=")" horiz-adv-x="806" d="M-40 -522q9 10 23.5 27.5t59 77.5t87 125t97.5 165.5t99.5 203t85 234.5t62.5 263q28 184 21.5 347.5t-37 300.5t-64 236.5t-60.5 155.5l-28 55h304q7 -9 18 -25.5t41.5 -74.5t56 -122.5t53 -167t42 -210.5t13.5 -251t-25 -290q-20 -123 -50 -237.5t-64 -204t-73 -170.5 t-77 -141t-74.5 -110.5t-67.5 -84.5t-54.5 -57.5t-36.5 -34.5l-14 -10h-338z" />
+<glyph unicode="*" horiz-adv-x="864" d="M251 1159l20 128l292 44l-19 -182zM312 854l94 281l171 -45l-151 -274zM526 949l124 153l201 -183l-90 -103zM564 1476l129 42l92 -254l-180 -68zM666 1169l270 164l56 -106l-234 -198z" />
+<glyph unicode="+" horiz-adv-x="964" d="M150 592l43 274h286l46 289h275l-46 -289h290l-43 -274h-290l-46 -289h-275l46 289h-286z" />
+<glyph unicode="," horiz-adv-x="526" d="M99 -180l18 111q22 -1 36 3t20.5 13.5t9 15.5t4.5 17l4 20h-23q-23 0 -35 13t-8 38l32 203q9 55 60 55h197q47 0 40 -55l-44 -277q-11 -67 -47 -107.5t-79.5 -51t-85.5 -11.5t-70 6z" />
+<glyph unicode="-" horiz-adv-x="722" d="M124 457l43 274h643l-43 -274h-643z" />
+<glyph unicode="." horiz-adv-x="530" d="M123 47l34 209q7 51 58 51h200q52 0 43 -51l-34 -209q-8 -47 -57 -47h-201q-22 0 -34 13t-9 34z" />
+<glyph unicode="/" horiz-adv-x="976" d="M4 -147l848 1724h346l-848 -1724h-346z" />
+<glyph unicode="0" horiz-adv-x="1277" d="M153 378l116 728q31 197 133 295t285 98h335q83 0 148 -20.5t104 -56.5t64 -84t28 -103t-4 -114l-117 -743q-30 -187 -127 -282.5t-273 -95.5h-336q-189 0 -287 98.5t-69 279.5zM496.5 397q-2.5 -19 4.5 -33.5t11 -24t16 -16t19.5 -10.5t22 -5.5t23 -2t22.5 -0.5h148 q68 0 105 28t50 106l99 621q11 73 -14 103.5t-86 30.5h-172q-126 0 -147 -134l-98 -619q-1 -25 -3.5 -44z" />
+<glyph unicode="1" horiz-adv-x="765" d="M230 1115l33 216q42 0 144 54.5t154 113.5h331l-236 -1499h-336l186 1168q-77 -53 -276 -53z" />
+<glyph unicode="2" horiz-adv-x="1193" d="M70 0l47 293q70 42 165 106.5t212.5 153.5t216 174t170 170.5t80.5 142.5q16 99 -33.5 135.5t-182.5 36.5h-497l40 251q159 29 292 43t325 14q112 0 196 -42t130 -113.5t62.5 -162.5t1.5 -194q-6 -45 -24 -92t-40.5 -88t-58 -86.5t-66.5 -80.5t-76 -77t-77 -70t-79 -65 t-72.5 -56t-66.5 -49t-53 -39h497l-49 -305h-1060z" />
+<glyph unicode="3" horiz-adv-x="1185" d="M60 43l41 250h487q116 0 165.5 23t60.5 98l7 46q3 20 2.5 36.5t-2 28.5t-9.5 21.5t-14 16t-21 11.5t-24 7.5t-31 5t-34 3t-40 2.5l-373 18l45 272l377 18q113 5 160 29t58 97l7 47q7 42 -3.5 68.5t-39.5 38t-58 15t-77 3.5h-514l39 248q89 29 206.5 43.5t230.5 14.5 t240 -1q165 -3 256.5 -115t63.5 -284l-17 -95q-38 -235 -209 -264q83 -26 109 -119.5t6 -221.5l-13 -74q-54 -344 -450 -344h-76h-80t-71.5 0.5t-78 2.5t-68 4.5t-72.5 7t-62.5 10t-66.5 14t-57 18.5z" />
+<glyph unicode="4" horiz-adv-x="1284" d="M99 459l652 1040h367l-531 -879h291l50 311l87 159h275l-75 -470h138l-40 -260l-147 -54l-47 -302h-338l47 302h-684z" />
+<glyph unicode="5" horiz-adv-x="1216" d="M111 40l43 267h561q46 0 77.5 12t47 35t21.5 40t10 42l16 102q9 60 -10.5 96t-88.5 36h-144q-110 0 -127 -108h-321l194 937h927l-49 -305h-601l-57 -281q64 40 152 47q66 6 186 -1q161 -11 232 -123t48 -280l-32 -232q-13 -81 -46 -142t-76 -96.5t-101 -57.5 t-112.5 -29.5t-119.5 -7.5q-207 -1 -324 7.5t-306 41.5z" />
+<glyph unicode="6" horiz-adv-x="1236" d="M182 484.5q2 143.5 32 332.5q21 132 51.5 237.5t68 177.5t78 123.5t88 81.5t90.5 45.5t92 21.5q176 15 339 2.5t318 -44.5l-40 -256h-484q-38 0 -70 -10.5t-55 -26.5t-42 -43t-30.5 -52t-22 -62t-16 -64.5t-12.5 -67.5q129 42 376 43q85 0 147 -22.5t95 -61t51.5 -89.5 t17 -108t-8.5 -117l-33 -222q-12 -75 -39.5 -130t-64 -88.5t-90 -53t-108.5 -26.5t-128 -7h-287q-74 0 -130 23t-100 80t-64.5 148.5t-18.5 235zM511 449q2 -74 36.5 -110.5t108.5 -36.5h110q56 0 87 24t42 89l16 95q12 74 -3.5 98.5t-81.5 24.5h-299q-18 -110 -16 -184z " />
+<glyph unicode="7" horiz-adv-x="1140" d="M230 1194l49 305h974l62 -144l-701 -1355h-362l625 1194h-647z" />
+<glyph unicode="8" horiz-adv-x="1269" d="M150.5 258q-2.5 42 0 68.5t7.5 58.5l20 131q14 87 65.5 140.5t134.5 65.5q-40 20 -66.5 50t-39 61.5t-16 72t-1.5 73.5t9 74l21 133q13 83 44 142.5t70 94t96 54.5t111 26t126 6h314q176 0 256 -99t51 -287l-16 -101q-3 -24 -14.5 -52.5t-33 -62t-60 -59.5t-87.5 -34 q46 -10 74.5 -48t36.5 -88.5t8 -95t-7 -83.5l-26 -167q-9 -53 -22.5 -96.5t-29.5 -75.5t-39.5 -57.5t-44.5 -42t-51.5 -28.5t-54.5 -18t-59.5 -9.5t-60 -4t-62.5 -0.5h-312q-78 0 -138 15.5t-97 39.5t-60.5 60t-33.5 68.5t-12.5 74.5zM501 400q-10 -62 13.5 -86t92.5 -24 h154q65 0 97 26.5t40 83.5l17 115q18 114 -94 114h-164q-121 0 -138 -114zM598 1012q-10 -65 16 -88t85 -23h162q38 0 63 7.5t39 24t20 34t11 45.5l12 81q13 79 -11.5 103t-85.5 24h-154q-70 0 -101.5 -25.5t-43.5 -101.5z" />
+<glyph unicode="9" horiz-adv-x="1234" d="M138 40l40 256h484q45 0 80.5 12.5t60.5 38.5t42.5 53.5t30.5 69.5t20 74t15 79q-129 -42 -377 -43q-71 0 -126 16.5t-89 46.5t-56 68.5t-29.5 86.5t-7 95t8.5 99l30 192q15 94 51 158t93.5 98.5t125 49t157.5 14.5h287q76 0 133.5 -26t101 -87.5t64 -158t17.5 -242.5 t-33 -336q-25 -157 -65 -274t-83 -185.5t-100.5 -112t-106.5 -60.5t-111 -24q-171 -16 -336.5 -3.5t-321.5 45.5zM567 992q-12 -74 3.5 -98.5t80.5 -24.5h299q18 110 15.5 184t-37 110.5t-108.5 36.5h-109q-56 0 -87 -24t-42 -89z" />
+<glyph unicode=":" horiz-adv-x="532" d="M123 47l34 209q7 51 58 51h200q52 0 43 -51l-34 -209q-8 -47 -57 -47h-201q-22 0 -34 13t-9 34zM247 828l34 209q7 51 57 51h201q51 0 42 -51l-33 -209q-8 -47 -58 -47h-200q-22 0 -34 13t-9 34z" />
+<glyph unicode=";" horiz-adv-x="532" d="M99 -180l18 111q22 -1 36 3t20.5 13.5t9 15.5t4.5 17l4 20h-23q-22 0 -34.5 14t-8.5 37l32 203q9 55 60 55h197q47 0 40 -55l-44 -277q-11 -67 -47 -107.5t-79.5 -51t-85.5 -11.5t-70 6zM250 828l32 209q7 52 57 52h201q52 0 43 -52l-32 -209q-8 -47 -59 -47h-201 q-22 0 -33 12.5t-8 34.5z" />
+<glyph unicode="&#x3c;" horiz-adv-x="903" d="M158 569l48 302l813 283l-47 -302l-454 -138l408 -143l-48 -300z" />
+<glyph unicode="=" horiz-adv-x="956" d="M96 357l44 275h874l-43 -275h-875zM166 801l44 274h874l-43 -274h-875z" />
+<glyph unicode="&#x3e;" horiz-adv-x="903" d="M111 271l48 303l458 163l-415 120l48 297l723 -283l-46 -302z" />
+<glyph unicode="?" horiz-adv-x="1112" d="M218 1208l40 249q158 35 290 49t296 7q73 0 136 -17.5t107 -48t78 -71.5t50 -88t22.5 -98t-3.5 -101l-22 -161q-28 -211 -148.5 -289.5t-366.5 -63.5l-14 -87q-14 -87 -13 -89h-261l67 424q23 -1 107.5 -1t106.5 1q81 3 129 39t61 118l11 75q13 82 -30.5 117.5 t-149.5 35.5h-493zM331 47l34 209q7 51 57 51h201q52 0 43 -51l-34 -209q-8 -47 -58 -47h-200q-22 0 -34 13t-9 34z" />
+<glyph unicode="@" horiz-adv-x="1857" d="M85 -27.5q-3 60.5 9 122.5l154 972q20 123 65.5 207t119 131.5t163.5 67.5t211 20h738q93 0 162 -26t109 -73t63 -111.5t23 -142t-11 -165.5l-96 -648q-11 -77 -35 -132.5t-70 -100t-122.5 -66.5t-184.5 -22h-218l-49 108q-18 -24 -36.5 -42.5t-49 -39t-74 -31 t-96.5 -9.5q-190 4 -273 157t-39 440q20 131 59 228.5t85 154t107 90t115.5 44.5t120.5 11q166 0 276 -32t187 -106l-102 -714q40 0 62 5.5t41 25t29 55t20 99.5l83 556q5 49 7 84.5t-7 60.5t-20.5 41t-34 25t-46.5 12t-59 3h-720q-56 0 -98.5 -14.5t-67.5 -35t-42.5 -53 t-24.5 -59.5t-13 -64l-149 -941q-9 -44 -4.5 -81t21 -64t57.5 -42.5t105 -15.5h791l-34 -204q-280 -55 -598 -55h-185q-92 0 -165 19.5t-120 53.5t-79.5 80.5t-44.5 101t-15 115zM794 405.5q0 -37.5 7.5 -63.5t21 -48t39 -33t61.5 -10q87 2 142.5 34.5t84.5 103.5l71 455 q-86 16 -198 16q-90 0 -141 -67.5t-76 -241.5q-6 -43 -9 -75.5t-3 -70z" />
+<glyph unicode="A" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM703 592h287l-68 481z" />
+<glyph unicode="B" horiz-adv-x="1228" d="M110 0l238 1499h618q92 0 163 -23t114 -63.5t69 -96.5q26 -55 30 -119l2 -36q0 -47 -7 -99q-17 -112 -88 -192t-174 -92q97 -16 153 -120q41 -76 41 -178q0 -37 -5 -76q-12 -87 -33.5 -151.5t-55.5 -109t-74.5 -73t-99 -44t-119.5 -21t-146 -5.5h-626zM493 290h273 q137 0 164 175q3 28 3 53q1 18 -1 36q-4 40 -32.5 67t-77.5 27h-274zM593 922h258q62 0 101.5 37.5t49.5 102.5q4 23 4 42q0 105 -108 105h-260z" />
+<glyph unicode="C" horiz-adv-x="1165" d="M170 538q2 120 24 263q29 187 73.5 315t118 220.5t181.5 136t260 43.5q180 0 288 -16.5t232 -60.5l-42 -262q-215 33 -420 33h-12q-97 -1 -134 -12q-81 -26 -130 -137q-47 -105 -79 -311q-23 -130 -23 -220q0 -24 2 -46q8 -100 58 -144t158 -47h29q153 0 415 18l-41 -262 q-108 -39 -226 -52q-90 -10 -226 -10q-42 0 -88 1q-111 1 -193 42t-131 112q-48 72 -72 174q-22 96 -22 208v14z" />
+<glyph unicode="D" horiz-adv-x="1333" d="M110 0l238 1499h625q88 0 158 -23.5t117.5 -64t80.5 -100t49 -127.5t21 -150q2 -39 3 -78q0 -43 -4 -86q-6 -82 -19 -173q-31 -202 -81 -336.5t-127 -214.5t-175 -113t-235 -33h-651zM492 291h262q119 0 186.5 112t103.5 342q18 113 21 195q1 20 1 37q0 57 -8 96 q-10 52 -34.5 82.5t-57.5 42t-82 11.5h-247z" />
+<glyph unicode="E" horiz-adv-x="1142" d="M148 329l136 858q13 78 42.5 136t67 91.5t89 53.5t99.5 26q41 5 89 5h16q450 -8 627 -33l-44 -280h-542q-37 0 -61.5 -9t-36.5 -28.5t-16.5 -34.5t-8.5 -42l-26 -164l546 -22l-45 -278l-552 -19l-28 -176q-2 -16 -2 -29.5t2.5 -23.5l4.5 -18t10 -13.5t11.5 -9.5t15.5 -6 t15.5 -3.5t18 -2t17.5 -0.5h18h521l-45 -278q-72 -10 -227 -18.5t-274 -12.5l-119 -4h-22q-38 0 -73 5q-46 7 -94 29.5t-80 58.5q-33 37 -48 99q-8 33 -8 72q0 33 6 71z" />
+<glyph unicode="F" horiz-adv-x="1144" d="M102 0l183 1156q16 98 56 167.5t97.5 107t119.5 53.5q58 15 124 15h8q451 -8 628 -33l-43 -280h-542q-30 0 -52 -7t-34.5 -17t-21 -27t-11.5 -30t-6 -33l-26 -170l546 -22l-43 -278l-555 -19l-92 -583h-336z" />
+<glyph unicode="G" horiz-adv-x="1259" d="M172 418q-2 38 -2 76q0 60 5 120q8 97 28 204q24 126 49 218t60.5 174.5t80.5 136t106.5 93.5t140.5 57.5t181 17.5h27q176 0 269 -13q100 -13 280 -62l-41 -256q-2 0 -34 4.5t-61.5 8.5t-80 9t-97 9t-104.5 7t-110 3q-70 0 -116.5 -16.5t-88.5 -66.5t-71.5 -144.5 t-52.5 -245.5q-26 -155 -26 -253v-13q2 -101 44.5 -143.5t139.5 -42.5q60 0 115 25t81 49l25 25l35 213h-161l33 210q118 51 366 51q66 0 139 -6l-139 -867h-239l-77 104q-54 -57 -119.5 -83t-182.5 -32q-14 -1 -28 -1q-84 0 -149 27q-76 31 -121.5 90.5t-72 137.5 t-31.5 175z" />
+<glyph unicode="H" horiz-adv-x="1302" d="M113 0l237 1499h336l-99 -621h441l98 621h336l-237 -1499h-336l90 572h-440l-90 -572h-336z" />
+<glyph unicode="I" horiz-adv-x="546" d="M115 0l238 1499h336l-238 -1499h-336z" />
+<glyph unicode="J" horiz-adv-x="727" d="M55 49l43 264q34 -2 63 -2q22 0 41 1q45 3 76.5 12t54 32t36 59t22.5 93l157 991h336l-185 -1161q-6 -45 -14.5 -80t-25.5 -80t-46.5 -81.5t-69.5 -59.5q-81 -47 -222 -47h-31q-162 6 -235 59z" />
+<glyph unicode="K" horiz-adv-x="1306" d="M110 0l238 1499h320l-97 -610h91l440 610h405l-554 -778l316 -721h-380l-240 599h-122l-94 -599h-323z" />
+<glyph unicode="L" horiz-adv-x="1079" d="M157 304l190 1195h335l-173 -1087q-2 -16 -2.5 -29t2 -23t5.5 -18t9.5 -14t12 -10t14.5 -6.5t15.5 -4t17.5 -2t17 -0.5h18h3h473l-49 -305h-612q-68 0 -122 16.5t-94 51.5q-41 35 -57 95q-9 34 -9 74q0 31 6 67z" />
+<glyph unicode="M" horiz-adv-x="1714" d="M84 0l382 1499h464l47 -943l341 943h475l-88 -1499h-331l57 920l-339 -920h-388l-52 919l-229 -919h-339z" />
+<glyph unicode="N" horiz-adv-x="1376" d="M110 0l238 1499h338l373 -886l139 886h335l-237 -1499h-334l-377 871l-137 -871h-338z" />
+<glyph unicode="O" d="M178 520q2 114 25 258q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q82 0 145.5 -8t126.5 -30.5t106.5 -60t77.5 -99.5q35 -61 50 -145q13 -74 13 -174v-27q-2 -117 -25 -264q-30 -194 -82 -327.5t-110.5 -208t-151 -114t-173 -49.5 t-207.5 -10q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 95.5q-36 60 -50 142q-13 72 -12 168v28zM516 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178q3 34 3 64q0 35 -4 63q-7 52 -21.5 83t-45 48.5t-66 23t-90.5 5.5 q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5t-47 -82.5t-41 -127.5t-34.5 -183q-15 -97 -21 -161q-4 -39 -3 -72q-1 -23 1 -44z" />
+<glyph unicode="P" horiz-adv-x="1224" d="M106 0l238 1499h626q44 0 85.5 -7t83.5 -24t76 -44t63 -67.5t44 -94.5t20 -124q1 -18 1 -36q0 -56 -11 -122q-21 -136 -64 -229.5t-96 -134.5q-54 -42 -116 -66q-53 -20 -103 -20h-19q-49 4 -94 4h-20h-3q-59 4 -168 19t-117 20l-90 -573h-336zM572 823h259 q66 0 106 46.5t57 152.5q5 36 5 64q1 52 -17 79q-28 42 -89 42h-260z" />
+<glyph unicode="Q" horiz-adv-x="1366" d="M180 526q2 115 25 259q23 148 58 261t72.5 189.5t94 129t104 80.5t123 43t130.5 18t145 3q81 0 145 -8.5t126.5 -31.5t106.5 -61.5t78.5 -101t49.5 -146.5q13 -75 13 -175v-27q-2 -118 -25 -265q-15 -98 -35 -180t-45.5 -146.5t-52 -116t-62 -89.5t-68.5 -65.5t-78.5 -46 t-84 -30t-93 -17t-98.5 -7.5t-107 -3q-83 0 -147 8t-127 30t-107 59t-78.5 97.5t-49.5 143.5q-13 72 -13 170v26zM518 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178q3 34 3 64q0 34 -4 63q-7 52 -21.5 83t-45 48.5 t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -161q-4 -38 -4 -72q0 -23 2 -44zM588 -68h184q16 -87 150 -87q69 0 169 23l-40 -256q-51 -10 -101 -10h-17q-59 2 -113.5 12t-100.5 36.5t-78.5 63.5t-46.5 93 q-9 36 -9 77q0 23 3 48z" />
+<glyph unicode="R" horiz-adv-x="1230" d="M106 0l238 1499h631q94 0 166 -28.5t123 -90.5q52 -62 68 -159q8 -48 7 -105q0 -59 -8 -129q-11 -76 -29.5 -137.5t-39 -101.5t-48 -71t-49.5 -47.5t-51 -28t-45 -15t-39 -6.5l211 -580h-381l-166 564l-161 13l-91 -577h-336zM575 834h253q78 0 115 44.5t50 147.5 q4 35 4 63q-1 53 -15 79q-22 40 -92 39h-255z" />
+<glyph unicode="S" horiz-adv-x="1191" d="M139 48l41 263q69 -8 221.5 -15t284.5 -7q75 0 120 23.5t55 85.5l8 59q3 20 3 37q0 34 -14 52q-20 28 -94 29h-179q-77 0 -137.5 18t-98 46t-63 67.5t-36.5 77.5q-12 36 -16 80q-3 32 -3 56q1 10 1 18q2 30 5 58l22 163q13 88 45 152.5t73.5 102t101.5 59.5t117 29.5 t133 8.5q34 1 66 0q325 0 513 -63l-42 -262q-86 8 -241 14t-238 6h-17q-88 0 -125 -20q-41 -22 -54 -101l-8 -50q-4 -23 -4 -41q0 -40 19 -58q27 -24 112 -25h184q71 0 127.5 -19t90 -51.5t58 -74.5t32 -88t10.5 -93q1 -13 1 -25q0 -33 -6 -63l-9 -131q-4 -60 -17.5 -110 t-32 -86.5t-47 -65.5t-56.5 -48.5t-65.5 -33t-69 -21t-72.5 -11.5t-70 -5t-68 -1q-210 0 -327 12t-234 52z" />
+<glyph unicode="T" horiz-adv-x="1212" d="M237 1194l49 305h1133l-49 -305h-405l-188 -1194h-336l188 1194h-392z" />
+<glyph unicode="U" horiz-adv-x="1337" d="M193 504q3 86 19 188l131 807h336l-135 -853q-16 -97 -16 -166q0 -17 1 -33q5 -78 51.5 -115t148.5 -37q75 0 126 21.5t83 69.5t50 107.5t33 152.5l135 853h338l-127 -899q-15 -93 -37.5 -170.5t-49 -136t-62.5 -104.5t-71 -77.5t-81 -54.5t-87 -35.5t-95 -20t-98.5 -9.5 t-102.5 -2q-53 0 -97 3.5t-92 13.5t-85.5 26t-74.5 44t-63 65t-46 90q-19 53 -27 119q-5 47 -6 105q0 23 1 48z" />
+<glyph unicode="V" horiz-adv-x="1415" d="M276 1499h354l119 -1073l476 1073h372l-711 -1499h-398z" />
+<glyph unicode="W" horiz-adv-x="2074" d="M276 1499h352l123 -1056l428 1056h356l-164 -378l97 -681l436 1059h355l-650 -1499h-385l-85 562l-242 -562h-409z" />
+<glyph unicode="X" horiz-adv-x="1349" d="M62 0l550 775l-318 724h370l181 -467l327 467h376l-563 -790l312 -709h-370l-173 450l-316 -450h-376z" />
+<glyph unicode="Y" d="M276 1499h365l139 -693l385 693h381l-652 -1059l-70 -440h-336l71 440z" />
+<glyph unicode="Z" horiz-adv-x="1136" d="M49 0l49 305l773 889h-634l49 305h1041l-50 -305l-744 -889h605l-49 -305h-1040z" />
+<glyph unicode="[" horiz-adv-x="694" d="M105.5 -172.5q0.5 60.5 11.5 123.5l217 1332q31 189 129.5 269t313.5 80h164l-43 -274h-87q-63 0 -100 -35.5t-52 -125.5l-206 -1275q-16 -98 7 -134t89 -36h95l-43 -274h-189q-87 0 -149.5 31.5t-95 79.5t-47.5 113t-14.5 125.5z" />
+<glyph unicode="\" horiz-adv-x="962" d="M275 1577h337l303 -1724h-337z" />
+<glyph unicode="]" horiz-adv-x="684" d="M-40 -522l43 274h87q63 0 100.5 35.5t52.5 125.5l202 1275q16 97 -9 133.5t-92 36.5h-87l45 274h170q80 0 141 -24t96.5 -66.5t56.5 -99t22.5 -122t-6.5 -135.5l-197 -1357q-9 -63 -24 -111.5t-46.5 -95t-77 -76.5t-117.5 -48.5t-166 -18.5h-194z" />
+<glyph unicode="^" horiz-adv-x="780" d="M241 1087l258 283h237l149 -283h-206l-74 120l-119 -120h-245z" />
+<glyph unicode="_" horiz-adv-x="1378" d="M54 -2l43 274h1299l-43 -274h-1299z" />
+<glyph unicode="`" horiz-adv-x="501" d="M244 1375h267l137 -288h-203z" />
+<glyph unicode="a" horiz-adv-x="1114" d="M128 341q-2 26 -1 53q0 101 24 228q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5h32q125 0 254 -27q145 -31 217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-106 116.5t-51 197.5zM464 413v-10q0 -61 24 -98 q26 -40 81 -40q75 0 120.5 26t76.5 78l69 465q-33 14 -82 18q-16 2 -32 2q-30 0 -56 -6q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158z" />
+<glyph unicode="b" horiz-adv-x="1140" d="M83 0l254 1608h335l-89 -571q70 31 154.5 49t154.5 18q74 0 128.5 -21.5t88 -63.5t52.5 -96.5t23 -127.5q1 -28 1 -57q1 -45 -3 -92q-6 -76 -21 -169q-43 -269 -143 -381q-96 -108 -285 -108h-14q-160 3 -282 117l-72 -105h-282zM471 324q57 -57 192 -57q65 0 101.5 59.5 t62.5 227.5q16 112 16 177q1 39 -5 61q-16 60 -84 60q-129 0 -205 -36z" />
+<glyph unicode="c" horiz-adv-x="1003" d="M138 320q-2 31 -2 65q0 91 17 206q21 131 55 225.5t73.5 150t93 87.5t104.5 42t119 10q107 0 253.5 -16.5t249.5 -52.5l-32 -203q-161 13 -343 13q-35 0 -54 -1.5t-43.5 -7t-38 -18t-30 -34t-28 -55t-23 -80.5t-22.5 -111q-13 -80 -15 -132v-23q0 -35 4 -61q6 -32 29 -49 t50 -22t75 -5q84 0 175 4.5t140 9.5l49 4l-32 -204q-114 -46 -230 -61q-96 -13 -243 -13q-29 0 -61 1q-79 1 -139 35.5t-101 108t-50 187.5z" />
+<glyph unicode="d" horiz-adv-x="1124" d="M133 407q1 91 19 193q17 98 38 170.5t55 138t80.5 106.5t114 65t155.5 24q71 0 152.5 -18t140.5 -49l91 571h335l-255 -1608h-282l-39 105q-160 -117 -313 -117q-74 0 -131 31.5t-92 86.5q-34 56 -52 133q-17 73 -17 158v10zM476 377q6 -64 27 -87t63 -23q133 0 208 57 l78 492q-64 36 -195 36q-41 0 -68 -20t-53 -87t-46 -191q-16 -86 -16 -144q0 -18 2 -33z" />
+<glyph unicode="e" horiz-adv-x="1081" d="M155 631q20 107 44 178.5t64 132t98.5 94.5t144 52.5t205.5 19.5h16q63 0 118 -7q62 -8 121 -29.5t99.5 -56t63.5 -90.5q20 -50 20 -113v-17q-4 -92 -32 -164.5t-72.5 -116.5t-99 -74t-114.5 -41q-61 -11 -117 -15q-24 -2 -46 -2q-30 0 -60 4q-50 6 -84.5 12t-50.5 13 q-5 -31 -5 -56q0 -53 24 -75q34 -32 145 -34h25q74 0 180 10q126 12 216 27l-41 -238q-207 -64 -449 -64q-68 0 -138 5q-194 12 -262 178q-38 91 -38 224q0 108 25 243zM500 629q6 -1 16 -3t39 -4q24 -2 47 -3q5 1 9 1q27 0 60.5 6t59.5 18.5t46.5 37.5t26.5 59q3 17 3 31 q0 37 -21 55q-27 22 -89 22h-11q-36 -1 -63 -8.5t-46 -24.5t-31 -33.5t-21.5 -46t-14 -50t-10.5 -57.5z" />
+<glyph unicode="f" horiz-adv-x="829" d="M159 844l34 208l167 35l28 171q31 195 126 273t283 78q159 0 253 -49l-31 -196l-170 2h-4q-74 0 -95 -34t-40 -156q-1 -7 -2 -10l-12 -79h235l-39 -243h-235l-136 -844h-336l136 844h-162z" />
+<glyph unicode="g" horiz-adv-x="1142" d="M27 -508l34 223h437q81 0 135 49.5t69 145.5l28 172q-103 -77 -251 -77q-116 0 -192 43.5t-110 124t-39 194.5q-1 21 -1 42q0 97 20 213q18 111 50.5 195t75.5 139t100.5 89.5t120.5 49t141 14.5q161 0 330.5 -20t246.5 -47l-187 -1178q-68 -426 -451 -426q-40 0 -83 5z M474 367q2 -22 8 -46t19.5 -36t34.5 -20t50 -8q54 0 92 8.5t86 33.5l91 566h-166q-35 0 -63 -12t-47.5 -36t-33 -48.5t-24 -61.5t-15.5 -61.5t-11 -61.5q-8 -53 -12.5 -84.5t-8.5 -71.5q-2 -23 -2 -40q0 -12 2 -21z" />
+<glyph unicode="h" horiz-adv-x="1130" d="M83 0l254 1603h334l-99 -627q44 32 70 48t72 39t96.5 33t109.5 10q78 0 132 -20.5t83.5 -55t42.5 -86.5q12 -47 12 -96q0 -6 -1 -11q-2 -55 -12 -125l-113 -712h-336l113 718q4 26 4 46q0 36 -12 54q-19 30 -67 29q-72 0 -123.5 -20t-102.5 -66l-121 -761h-336z" />
+<glyph unicode="i" horiz-adv-x="485" d="M75 0l172 1087h336l-172 -1087h-336zM265 1243l32 207q7 52 57 52h256q22 0 32 -14q7 -11 6 -27v-11l-32 -207q-6 -47 -54 -47h-256q-22 0 -33 12q-9 10 -9 26q0 4 1 9z" />
+<glyph unicode="j" horiz-adv-x="518" d="M5 -553l260 1640h336l-174 -1095q-26 -170 -62.5 -301.5t-107.5 -243.5h-252zM280 1243l34 207q7 52 57 52h256q22 0 32 -14q8 -12 8 -28q0 -5 -1 -10l-34 -207q-6 -47 -53 -47h-256q-22 0 -34 13q-10 10 -10 26q0 4 1 8z" />
+<glyph unicode="k" horiz-adv-x="1116" d="M83 0l254 1602h336l-143 -893q121 47 221 147t141 231h354q-28 -102 -72.5 -187.5t-97.5 -144.5t-100.5 -97.5t-98.5 -67.5l304 -590h-369l-238 481l-78 -2l-77 -479h-336z" />
+<glyph unicode="l" horiz-adv-x="643" d="M139 387l193 1217h336l-182 -1155q-9 -57 -9.5 -94.5t9 -59t21.5 -31.5t34 -20q96 -42 107 -42l-32 -202h-201q-155 0 -231 92q-54 66 -54 187q0 49 9 108z" />
+<glyph unicode="m" horiz-adv-x="1775" d="M83 0l172 1087h275l43 -112q97 68 140 88q89 41 202 41q100 0 163.5 -36.5t87.5 -100.5q48 30 84.5 50t88.5 42t108.5 33.5t116.5 11.5q93 0 153 -30t85 -83q24 -53 30 -125q1 -18 1 -38q0 -56 -11 -118l-113 -710h-336l114 716q3 22 3 41q0 88 -79 88q-145 0 -228 -74 q-1 -6 -9 -62l-113 -709h-336l113 716q3 22 3 41q0 88 -79 88q-72 0 -122 -19.5t-101 -65.5l-120 -760h-336z" />
+<glyph unicode="n" horiz-adv-x="1130" d="M83 0l172 1087h275l43 -111q48 34 73 50t70.5 38.5t95 32t108.5 9.5q78 0 132 -20.5t83.5 -55t42.5 -86.5q12 -47 12 -96q0 -6 -1 -11q-2 -55 -12 -125l-113 -712h-336l113 718q4 26 4 46q0 36 -12 54q-19 30 -67 29q-72 0 -123.5 -20t-102.5 -66l-121 -761h-336z" />
+<glyph unicode="o" horiz-adv-x="1136" d="M150 567q21 134 53.5 226t77 153.5t113 95t149.5 47t198 13.5q275 0 370 -146q62 -95 62 -264q0 -91 -18 -202q-17 -103 -39 -177.5t-56 -131t-77 -92.5t-104.5 -58.5t-134.5 -31.5t-172 -9q-276 0 -372 140q-65 94 -65 259q0 80 15 178zM470 403q-1 -16 0 -31 q0 -30 3 -50q5 -32 24 -47t43.5 -20.5t67.5 -5.5q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 84 17 134q3 30 3 57q0 17 -1 33q-3 39 -20.5 57t-44 26t-72.5 8q-39 0 -64.5 -4t-47 -18.5t-35 -33.5t-26 -58.5t-21.5 -83.5t-21 -117q-14 -76 -16 -125z " />
+<glyph unicode="p" horiz-adv-x="1138" d="M-4 -553l256 1589q95 28 261 45t325 17q136 0 219 -75t106 -209q11 -63 11 -137q0 -84 -14 -182q-42 -276 -153 -395t-337 -119q-164 0 -241 78l-97 -612h-336zM464 275q52 -43 133 -43q17 0 36 2q56 3 89 29.5t58 95t46 198.5q14 89 14 155q0 65 -28 104q-27 39 -85 39 h-168z" />
+<glyph unicode="q" horiz-adv-x="1132" d="M136 340q-2 22 -2 44q0 96 20 211q23 145 66.5 245.5t107.5 158t141 82.5t178 25q161 0 327 -20t244 -47l-251 -1592h-336l96 612q-104 -79 -252 -79q-115 0 -190.5 43t-109.5 123.5t-39 193.5zM470 374v-20q0 -28 4 -45q6 -22 18.5 -42t35 -27.5t56.5 -7.5q53 0 91 8.5 t86 33.5l92 588h-168q-34 0 -61.5 -13t-46.5 -38.5t-33 -52t-24.5 -66t-16 -66t-11.5 -66.5q-10 -66 -15 -104.5t-7 -81.5z" />
+<glyph unicode="r" horiz-adv-x="847" d="M83 0l172 1087h291l22 -137q60 63 139 105.5t164 42.5q76 0 108 -12l-51 -323q-46 3 -158 3q-45 0 -75 -3.5t-64.5 -15t-61.5 -37t-48 -65.5l-102 -645h-336z" />
+<glyph unicode="s" horiz-adv-x="1042" d="M108 54l32 203h495q58 0 67 54l6 35q5 29 -5.5 42.5t-44.5 13.5h-222q-147 0 -221 88q-56 66 -56 171q0 34 6 72l16 97q21 133 99 201.5t231 68.5q121 0 191 -1.5t164.5 -6.5t150.5 -19t80 -36l-32 -204h-476q-38 0 -54.5 -14t-21.5 -44l-6 -36q-2 -10 -2 -17.5t2 -13 t3.5 -9.5t6.5 -6.5t7.5 -4t9.5 -2t9.5 -0.5h11.5h11h230q63 0 112.5 -17.5t79 -48t48.5 -71.5q18 -41 20 -87q0 -9 1 -18q0 -37 -5 -76l-19 -123q-10 -64 -34 -112t-54 -75.5t-70.5 -44t-76 -21.5t-78.5 -5q-163 0 -261.5 2.5t-209.5 18.5t-141 46z" />
+<glyph unicode="t" horiz-adv-x="768" d="M145 846l28 176l177 68l101 303h283l-48 -303h216l-39 -244h-216l-63 -396q-9 -59 -10 -96.5t8.5 -59.5t21 -32t33.5 -20q98 -41 109 -41l-31 -203h-219q-140 0 -214 96q-52 67 -52 186q0 50 9 109l72 457h-166z" />
+<glyph unicode="u" horiz-adv-x="1128" d="M116 250q2 56 12 126l113 711h336l-115 -717q-4 -27 -4 -48q0 -35 12 -53q20 -28 69 -28q72 0 123.5 20t102.5 66l121 760h336l-174 -1087h-275l-42 112q-58 -45 -98.5 -69.5t-104 -42.5t-142.5 -18q-78 0 -132 20.5t-84 54t-43 85.5q-12 47 -12 96q1 6 1 12z" />
+<glyph unicode="v" horiz-adv-x="1110" d="M163 1087h356l84 -719l215 470q58 117 70 253h316q7 -36 7 -75q0 -132 -82 -292l-369 -724h-407z" />
+<glyph unicode="w" horiz-adv-x="1718" d="M163 1087h355l82 -717l216 466q58 117 70 253h313q7 -37 7 -76q0 -93 -40 -197l-24 -58l70 -385l220 465q58 117 70 253h314q7 -38 7 -78q0 -134 -82 -289l-379 -724h-378l-65 361l-164 -361h-402z" />
+<glyph unicode="x" horiz-adv-x="1208" d="M34 0l455 567l-283 520h400l121 -291l216 291h405l-460 -581l274 -506h-387l-124 279l-210 -279h-407z" />
+<glyph unicode="y" horiz-adv-x="1163" d="M165 1087h348l45 -728q6 -73 92 -80l231 558q37 92 52 253h317q8 -40 8 -84q0 -128 -68 -285l-312 -720q-48 -109 -105 -198.5t-108.5 -148.5t-113.5 -105.5t-106 -71t-102.5 -44t-86.5 -25.5t-72 -13v236q132 66 212.5 155t144.5 214q-280 0 -307 296z" />
+<glyph unicode="z" horiz-adv-x="983" d="M72 2l42 271l534 540h-476l42 274h903l-42 -274l-507 -537h419l-42 -274h-873z" />
+<glyph unicode="{" horiz-adv-x="655" d="M114 474l40 244q30 2 52 6.5t45 15.5t37.5 31.5t19.5 50.5l76 475q29 180 152.5 257.5t365.5 77.5l-43 -274q-75 1 -110.5 -46.5t-56.5 -183.5l-51 -329q-31 -186 -238 -206q93 -18 138.5 -70t32.5 -132l-69 -432q-22 -118 -1 -170.5t99 -51.5l-41 -259 q-126 0 -213.5 31.5t-131 87t-59.5 132.5t2 168l74 463q8 55 -25 87t-95 27z" />
+<glyph unicode="|" horiz-adv-x="507" d="M93 -147l273 1724h274l-272 -1724h-275z" />
+<glyph unicode="}" horiz-adv-x="655" d="M-40 -522l41 259q76 -1 110.5 47t52.5 161l69 426q26 160 234 201q-202 18 -171 207l53 336q22 148 3.5 196.5t-95.5 46.5l45 274q95 0 168.5 -23t118 -63.5t72 -95.5t30.5 -120t-6 -137l-50 -389q-7 -56 28 -84t94 -30l-40 -245q-62 3 -103 -22t-50 -81l-87 -520 q-33 -195 -147.5 -269.5t-369.5 -74.5z" />
+<glyph unicode="~" horiz-adv-x="841" d="M259 1211q67 68 132 108.5t141 40.5q46 0 105.5 -36t99.5 -36q98 -4 205 82l29 -135q-134 -148 -255 -148q-46 0 -114.5 36t-107.5 36q-55 0 -96.5 -16.5t-106.5 -55.5z" />
+<glyph unicode="&#xa1;" horiz-adv-x="569" d="M29 -552l210 1093h264l-138 -1093h-336zM244 693l32 205q6 43 57 47h201q19 -2 31 -17.5t9 -36.5l-31 -198q-10 -51 -53 -54h-206q-47 2 -40 54z" />
+<glyph unicode="&#xa2;" horiz-adv-x="991" d="M139 591q18 111 44 194.5t60 139t70.5 91t84 53.5t92 24.5t102.5 5.5l33 199h196l-33 -205q171 -16 299 -64l-32 -203q-161 14 -343 14q-62 0 -89 -5t-60 -32.5t-52 -89.5t-38 -173q-13 -80 -15 -132t4.5 -84.5t29 -49t49.5 -21.5t75 -5q84 0 175 4.5t140 9.5l49 4 l-32 -204q-133 -70 -342 -74l-28 -183h-197l30 184q-164 3 -242 153t-30 449z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1183" d="M69 0l41 259l140 46l51 325h-132l27 169l139 50l28 170q12 76 30 138t38.5 109t50.5 83t58 60.5t70.5 41.5t77.5 26.5t89.5 14.5t96.5 6t108 1q52 0 143.5 -8.5t156.5 -16.5l65 -8l-42 -270h-378q-63 0 -99 -6t-64.5 -26t-43 -56.5t-24.5 -100.5l-25 -158l411 -35 l-28 -184h-417l-51 -325h576l-49 -305h-1044z" />
+<glyph unicode="&#xa4;" horiz-adv-x="907" d="M134 370l116 101q-34 84 -22 165q14 87 64 157l-87 96l122 109l83 -93q92 57 190 57q99 0 172 -54l110 98l99 -105l-119 -104q32 -78 19 -165q-19 -111 -89 -192l82 -93l-119 -113l-95 107q-69 -35 -155 -35q-93 0 -166 52l-110 -98zM406 635q-10 -62 26 -106.5t98 -45.5 q67 -1 115 42.5t60 107.5q11 62 -26 107.5t-101 44.5q-65 -1 -113 -44t-59 -106z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1323" d="M254 275l29 182h261l10 64h-261l30 182h163l-223 796h364l135 -668l371 668h400l-515 -796h180l-30 -182h-278l-10 -64h278l-30 -182h-276l-41 -275h-336l41 275h-262z" />
+<glyph unicode="&#xa6;" horiz-adv-x="509" d="M93 -147l107 671h274l-106 -671h-275zM255 879l111 698h274l-111 -698h-274z" />
+<glyph unicode="&#xa7;" horiz-adv-x="1097" d="M154 23l36 235h465q40 0 59 11.5t25 43.5l9 56q5 32 -9.5 44t-54.5 12h-211q-150 0 -231 72.5t-59 210.5l8 50q5 33 8.5 49t15.5 47.5t28.5 50.5t48.5 40t75 34q-130 72 -99 260l10 82q37 285 347 285q155 0 322.5 -10t247.5 -29l-36 -236h-469q-69 0 -79 -62l-7 -45 q-4 -28 10 -45.5t51 -17.5h210q163 0 238.5 -69.5t55.5 -202.5l-8 -50q-26 -177 -170 -219q39 -8 62.5 -37.5t30.5 -69.5t7.5 -73.5t-4.5 -64.5l-15 -104q-14 -91 -46.5 -150.5t-80.5 -88t-95.5 -38.5t-111.5 -10q-448 0 -584 39zM530 760q-8 -47 10 -61.5t63 -14.5h107 q56 0 74.5 16.5t24.5 61.5l10 59q7 43 -5.5 61.5t-70.5 18.5h-107q-54 0 -71 -18.5t-25 -65.5z" />
+<glyph unicode="&#xa8;" horiz-adv-x="909" d="M257 1192q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5zM779 1192q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1626" d="M174 588.5q1 94.5 17 195.5q14 88 32 163t46.5 149.5t64.5 133.5t86.5 110.5t112 85.5t141.5 53.5t175 19.5h440q86 0 153.5 -23.5t113 -64t76 -100t45.5 -126.5t18.5 -148t-2.5 -160.5t-20 -168.5q-58 -363 -214 -535.5t-395 -172.5h-440q-96 0 -173 30.5t-128.5 85.5 t-86 128t-49 161.5t-13.5 183zM383.5 532.5q5.5 -102.5 32.5 -178t85.5 -118.5t143.5 -43h428q303 0 392 561q10 62 15.5 109t8.5 107.5t-1.5 105t-18.5 90.5t-39 75t-66.5 47.5t-97.5 18.5h-445q-58 0 -107 -13.5t-99 -50.5t-89 -97.5t-72.5 -160t-54.5 -231.5 q-21 -119 -15.5 -221.5zM557.5 552q-8.5 90 9.5 222q20 124 54 208t82.5 129.5t102.5 64t126 18.5q84 0 190.5 -11.5t181.5 -37.5l-26 -168q-169 24 -314 24q-84 0 -125.5 -55.5t-65.5 -204.5q-20 -129 9 -188t112 -59q152 0 325 32l-26 -168q-81 -35 -172.5 -46t-216.5 -11 q-64 0 -113.5 24.5t-87 80.5t-46 146z" />
+<glyph unicode="&#xaa;" horiz-adv-x="741" d="M124 534l23 149h671l-23 -149h-671zM183 945q-24 95 6 237q12 63 32.5 113t42.5 82.5t52.5 56.5t56 36.5t61.5 19.5t60 9t59 3q95 3 201 -18.5t153 -67.5l-95 -653h-174l-36 94q-25 -48 -92 -75.5t-132 -27.5q-67 0 -119 48t-76 143zM410.5 1014q12.5 -50 64.5 -50 q50 0 89 19.5t59 54.5l39 270q-24 10 -65 13t-65 -3q-28 -7 -47 -18.5t-40 -49t-30 -100.5q-17 -86 -4.5 -136z" />
+<glyph unicode="&#xab;" horiz-adv-x="1200" d="M183 725l488 416l149 -174l-304 -261l227 -263l-195 -144zM643 725l487 416l150 -174l-304 -261l227 -263l-195 -144z" />
+<glyph unicode="&#xac;" horiz-adv-x="985" d="M131 478l41 259h875q-9 -58 -33.5 -205.5t-33.5 -205.5h-259l25 152h-615z" />
+<glyph unicode="&#xad;" horiz-adv-x="722" d="M112 457l43 274h643l-43 -274h-643z" />
+<glyph unicode="&#xae;" horiz-adv-x="1626" d="M174 588.5q1 94.5 17 195.5q14 88 32 163t46.5 149.5t64.5 133.5t86.5 110.5t112 85.5t141.5 53.5t175 19.5h440q86 0 153.5 -23.5t113 -64t76 -100t45.5 -126.5t18.5 -148t-2.5 -160.5t-20 -168.5q-58 -363 -214 -535.5t-395 -172.5h-440q-96 0 -173 30.5t-128.5 85.5 t-86 128t-49 161.5t-13.5 183zM383.5 532.5q5.5 -102.5 32.5 -178t85.5 -118.5t143.5 -43h428q303 0 392 561q10 62 15.5 109t8.5 107.5t-1.5 105t-18.5 90.5t-39 75t-66.5 47.5t-97.5 18.5h-445q-58 0 -107 -13.5t-99 -50.5t-89 -97.5t-72.5 -160t-54.5 -231.5 q-21 -119 -15.5 -221.5zM542 313l139 875h378q53 0 95.5 -12.5t79.5 -42t52 -87.5t3 -139q-18 -127 -65 -184t-125 -81l124 -329h-223l-114 318l-81 24l-55 -342h-208zM828 807h121q55 0 79 7.5t35 26.5t18 67q9 57 -12.5 72t-89.5 15h-121z" />
+<glyph unicode="&#xaf;" horiz-adv-x="735" d="M241 1087l28 176h598l-28 -176h-598z" />
+<glyph unicode="&#xb0;" horiz-adv-x="546" d="M269 1294q6 87 70 146t151 59t144 -59t51 -146t-69 -144t-150 -57q-88 0 -145.5 57.5t-51.5 143.5zM395 1294q-2 -34 21 -57.5t58 -23.5q34 0 59 23t27 58t-20 59.5t-56 24.5t-60.5 -24.5t-28.5 -59.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1005" d="M98 132l43 275h852l-43 -275h-852zM203 777l42 275h287l46 288h274l-46 -288h291l-42 -275h-291l-47 -289h-274l46 289h-286z" />
+<glyph unicode="&#xb2;" horiz-adv-x="825" d="M132 728l35 223q63 38 138 87t168.5 117t158 134t71.5 110q9 60 -22 80.5t-119 20.5h-316l3 20q3 20 7.5 48t9.5 56.5t8 47.5l4 20q112 22 198 31.5t216 9.5q77 0 136 -29t90.5 -76t43.5 -105t2 -118q-9 -60 -42 -122t-66 -104t-90 -93.5t-81 -70t-72 -54.5h278l-37 -233 h-722z" />
+<glyph unicode="&#xb3;" horiz-adv-x="835" d="M136 759l31 191l315 1q78 0 110 13t38 55l3 19q6 42 -21 56.5t-97 17.5l-238 9l32 207l243 9q75 3 105.5 16t36.5 52l2 18q8 40 -21.5 53.5t-97.5 13.5h-334l30 190q89 31 198.5 39t260.5 4q118 -1 180.5 -77.5t43.5 -191.5l-9 -58q-12 -75 -50 -121t-100 -56 q60 -19 80 -80.5t8 -142.5l-8 -45q-38 -235 -314 -233h-52h-54.5t-49.5 0.5t-51.5 1.5t-46 3t-48 5t-42.5 7t-44 10t-39 14z" />
+<glyph unicode="&#xb4;" horiz-adv-x="497" d="M199 1087l219 288h272l-288 -288h-203z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1198" d="M36 -553l147 929l113 711h336l-114 -717q-11 -70 8.5 -99.5t67.5 -29.5q72 0 124 20t103 66l121 760h335l-172 -1087h-275l-43 112q-15 -8 -54.5 -31t-58.5 -33.5t-51 -23.5t-61 -19q-52 -12 -102 -6l-88 -552h-336z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1177" d="M212.5 963.5q-1.5 46.5 3.5 92.5l28 190q12 74 44 125t83 78t108 38.5t131 11.5h778l-37 -232h-95l-201 -1267h-228l202 1271h-116l-288 -1824h-229l208 1315l-18 -10q-19 -10 -44.5 -17.5t-55.5 -7.5q-67 0 -119 19.5t-82.5 52.5t-50.5 75.5t-21.5 89zM446 1022 q0 -14 3 -24t6.5 -17.5t11 -12t14 -7.5t17.5 -4t18.5 -1.5t20.5 -0.5h97l51 317h-95q-68 0 -91 -22.5t-34 -90.5l-16 -105q-3 -18 -3 -32z" />
+<glyph unicode="&#xb7;" horiz-adv-x="530" d="M224 685l34 209q7 51 57 51h201q52 0 43 -51l-34 -209q-8 -47 -58 -47h-200q-22 0 -34 13t-9 34z" />
+<glyph unicode="&#xb8;" horiz-adv-x="493" d="M11 -370l23 141l88 30q44 18 56.5 39.5t22.5 83.5h214q-25 -160 -87.5 -227t-196.5 -67h-120z" />
+<glyph unicode="&#xb9;" horiz-adv-x="573" d="M220 1426l27 176q34 0 113 39t113 79h252l-157 -992h-256l119 736q-49 -38 -211 -38z" />
+<glyph unicode="&#xba;" horiz-adv-x="788" d="M153 535l23 150h672l-23 -150h-672zM230 1149q18 109 47.5 178t80 108t115 54t162.5 15q186 1 255.5 -95t35.5 -312q-31 -197 -116.5 -265.5t-287.5 -68.5q-184 0 -253.5 95t-38.5 291zM460 1050q-1 -29 2.5 -47.5t17 -27t29 -11.5t43.5 -3q50 -1 71.5 8t36 42.5 t27.5 113.5q5 34 8 54.5t4.5 42t0.5 32.5t-5.5 22t-10.5 15.5t-18 8.5t-25 5t-34 1q-76 1 -97.5 -28.5t-40.5 -152.5q-8 -46 -9 -75z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1196" d="M143 477l309 271l-212 238l184 155l357 -419l-481 -423zM605 477l308 271l-213 238l185 155l358 -419l-481 -423z" />
+<glyph unicode="&#xbc;" horiz-adv-x="2029" d="M220 1222l27 175q34 0 113 39.5t113 79.5h252l-157 -993h-256l119 736q-48 -37 -211 -37zM408 0l1050 1577h248l-1051 -1577h-247zM1182 295l433 695h273l-343 -568h185l31 195l63 103h200l-47 -298h91l-31 -199l-102 -39l-24 -182h-246l28 181h-466z" />
+<glyph unicode="&#xbd;" horiz-adv-x="2101" d="M220 1222l27 175q34 0 113 39.5t113 79.5h252l-157 -993h-256l119 736q-48 -37 -211 -37zM400 0l1051 1577h248l-1051 -1577h-248zM1326 -2l35 224q63 38 138 87t168.5 117t158 134t71.5 110q9 60 -21.5 80.5t-118.5 20.5h-315l2 20q3 20 7.5 48t8.5 56.5t8 48.5l3 19 q112 21 198.5 31t216.5 10q77 0 136 -29t90.5 -76t43.5 -105t2 -118q-7 -44 -26 -88.5t-40.5 -79.5t-57 -74.5t-59 -63.5t-64.5 -57.5t-55.5 -44.5t-48.5 -37h278l-37 -233h-722z" />
+<glyph unicode="&#xbe;" horiz-adv-x="2256" d="M136 554l31 191l315 1q78 0 110 13t38 55l3 20q6 42 -21 56t-97 17l-238 9l32 207l243 10q75 3 105.5 16t36.5 52l2 17q8 41 -21.5 54.5t-97.5 13.5h-334l30 189q89 31 198.5 39t260.5 4q118 -1 180.5 -77.5t43.5 -191.5l-9 -58q-12 -75 -50 -121t-100 -56 q60 -19 80 -80.5t8 -142.5l-8 -45q-38 -235 -314 -233h-52h-54.5t-49.5 0.5t-51.5 1.5t-46 3t-48 5t-42.5 7t-44 10t-39 14zM614 0l1051 1577h248l-1051 -1577h-248zM1367 295l435 695h272l-345 -568h186l31 195l63 103h200l-47 -298h91l-30 -199l-103 -39l-24 -182h-247 l29 181h-466z" />
+<glyph unicode="&#xbf;" horiz-adv-x="1107" d="M26.5 -207.5q-6.5 52.5 3.5 102.5l21 130q34 213 153.5 296.5t361.5 68.5l14 87q15 87 14 89h261l-67 -424q-23 1 -107.5 1t-106.5 -1q-81 -3 -128.5 -39t-60.5 -118l-13 -75q-13 -82 30.5 -117.5t149.5 -35.5h494l-39 -249q-158 -35 -291 -49t-297 -7q-73 0 -136 19 t-106.5 51.5t-77.5 76t-50 92.5t-22.5 101.5zM600 709l32 209q8 47 58 47h202q22 0 33 -12.5t8 -34.5l-32 -209q-7 -51 -57 -51h-202q-52 0 -42 51z" />
+<glyph unicode="&#xc0;" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM701 1920h267l137 -288h-202zM703 592h287l-68 481z" />
+<glyph unicode="&#xc1;" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM703 592h287l-68 481zM903 1632l219 288h271l-288 -288h-202z" />
+<glyph unicode="&#xc2;" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM683 1632l258 282h237l149 -282h-204l-77 121l-135 -121h-228zM703 592h287l-68 481z" />
+<glyph unicode="&#xc3;" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM671 1756q145 147 273 147q48 -1 108.5 -36.5t96.5 -35.5q51 -3 109 22t95 57l30 -135q-139 -143 -255 -142q-40 0 -79 18t-75 35.5t-68 17.5q-57 -1 -100 -17.5t-103 -54.5zM703 592h287l-68 481z" />
+<glyph unicode="&#xc4;" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM638 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5zM703 592h287l-68 481zM1160 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5 q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5z" />
+<glyph unicode="&#xc5;" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-52 301h-441l-143 -301h-372zM703 592h287l-68 481zM797 1701q7 87 72 146.5t152 59.5t142.5 -59.5t48.5 -146.5q-8 -88 -71 -147t-149 -59q-87 0 -144.5 59.5t-50.5 146.5zM925 1701q-3 -34 18 -56t55 -22t58.5 22t27.5 56t-17 57 t-54 23t-59.5 -23t-28.5 -57z" />
+<glyph unicode="&#xc6;" horiz-adv-x="2150" d="M41 0l752 1157q62 95 133 162.5t141.5 102.5t147.5 55.5t151 21.5t153 0q454 -8 629 -33l-43 -280h-543q-37 0 -61.5 -9t-36.5 -28t-16.5 -34t-8.5 -42l-28 -174l547 -22l-43 -277l-555 -19l-27 -169q-2 -16 -2.5 -29.5t2.5 -23.5t5.5 -18t10 -13.5t11.5 -9.5t15.5 -6 t15.5 -3.5t18 -2t17 -0.5h18h522l-45 -278q-72 -10 -225.5 -18.5t-271.5 -12.5l-117 -4q-47 -3 -93.5 2t-96 22t-85 45t-53.5 77t-8 113l19 122h-328l-247 -374h-374zM845 664h192l65 404z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1165" d="M170.5 538q1.5 120 23.5 263q29 187 73.5 315t118 220.5t181.5 136t260 43.5q180 0 288 -16.5t232 -60.5l-42 -262q-221 34 -432 33q-96 -1 -133 -12q-81 -26 -129 -136q-47 -105 -80 -312q-29 -166 -21.5 -266.5t57.5 -144t158 -46.5q156 -2 444 18l-41 -262 q-108 -39 -225.5 -52t-314.5 -9q-111 1 -193 42t-130.5 112t-72 173.5t-22 222.5zM350 -368l23 140l88 31q44 16 57.5 38.5t23.5 84.5h214q-25 -160 -88.5 -227t-197.5 -67h-120z" />
+<glyph unicode="&#xc8;" horiz-adv-x="1142" d="M148 329l136 858q13 78 42.5 136t67 91.5t89 53.5t99 26t105.5 5q450 -8 627 -33l-44 -280h-542q-37 0 -61.5 -9t-36.5 -28.5t-16.5 -34.5t-8.5 -42l-26 -164l546 -22l-45 -278l-552 -19l-28 -176q-2 -16 -2.5 -29.5t2.5 -23.5t5 -18t10 -13.5t11.5 -9.5t15.5 -6 t15.5 -3.5t18 -2t17.5 -0.5h18h521l-45 -278q-72 -10 -227 -18.5t-274 -12.5l-119 -4q-49 -2 -95 5t-94 29.5t-80.5 58.5t-47.5 98.5t-2 143.5zM559 1910h267l138 -288h-203z" />
+<glyph unicode="&#xc9;" horiz-adv-x="1142" d="M148 329l136 858q13 78 42.5 136t67 91.5t89 53.5t99 26t105.5 5q450 -8 627 -33l-44 -280h-542q-37 0 -61.5 -9t-36.5 -28.5t-16.5 -34.5t-8.5 -42l-26 -164l546 -22l-45 -278l-552 -19l-28 -176q-2 -16 -2.5 -29.5t2.5 -23.5t5 -18t10 -13.5t11.5 -9.5t15.5 -6 t15.5 -3.5t18 -2t17.5 -0.5h18h521l-45 -278q-72 -10 -227 -18.5t-274 -12.5l-119 -4q-49 -2 -95 5t-94 29.5t-80.5 58.5t-47.5 98.5t-2 143.5zM769 1622l219 288h272l-288 -288h-203z" />
+<glyph unicode="&#xca;" horiz-adv-x="1142" d="M148 329l136 858q13 78 42.5 136t67 91.5t89 53.5t99 26t105.5 5q450 -8 627 -33l-44 -280h-542q-37 0 -61.5 -9t-36.5 -28.5t-16.5 -34.5t-8.5 -42l-26 -164l546 -22l-45 -278l-552 -19l-28 -176q-2 -16 -2.5 -29.5t2.5 -23.5t5 -18t10 -13.5t11.5 -9.5t15.5 -6 t15.5 -3.5t18 -2t17.5 -0.5h18h521l-45 -278q-72 -10 -227 -18.5t-274 -12.5l-119 -4q-49 -2 -95 5t-94 29.5t-80.5 58.5t-47.5 98.5t-2 143.5zM556 1622l258 282h238l148 -282h-206l-74 119l-118 -119h-246z" />
+<glyph unicode="&#xcb;" horiz-adv-x="1142" d="M148 329l136 858q13 78 42.5 136t67 91.5t89 53.5t99 26t105.5 5q450 -8 627 -33l-44 -280h-542q-37 0 -61.5 -9t-36.5 -28.5t-16.5 -34.5t-8.5 -42l-26 -164l546 -22l-45 -278l-552 -19l-28 -176q-2 -16 -2.5 -29.5t2.5 -23.5t5 -18t10 -13.5t11.5 -9.5t15.5 -6 t15.5 -3.5t18 -2t17.5 -0.5h18h521l-45 -278q-72 -10 -227 -18.5t-274 -12.5l-119 -4q-49 -2 -95 5t-94 29.5t-80.5 58.5t-47.5 98.5t-2 143.5zM485 1726q8 52 51 89t96 37q52 0 83 -36.5t23 -89.5q-8 -52 -51 -89.5t-96 -37.5q-52 0 -83 37t-23 90zM1007 1726q8 52 51 89 t96 37q52 0 83 -36.5t23 -89.5t-51 -90t-95 -37t-83.5 37t-23.5 90z" />
+<glyph unicode="&#xcc;" horiz-adv-x="546" d="M115 0l238 1499h336l-238 -1499h-336zM239 1920h267l138 -288h-203z" />
+<glyph unicode="&#xcd;" horiz-adv-x="546" d="M115 0l238 1499h336l-238 -1499h-336zM441 1632l219 288h271l-287 -288h-203z" />
+<glyph unicode="&#xce;" horiz-adv-x="546" d="M115 0l238 1499h336l-238 -1499h-336zM219 1632l258 282h238l148 -282h-203l-77 121l-135 -121h-229z" />
+<glyph unicode="&#xcf;" horiz-adv-x="546" d="M115 0l238 1499h336l-238 -1499h-336zM175 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51.5 -90.5t-95.5 -37.5t-83 37.5t-23 90.5zM697 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1325" d="M86 693l23 142h133l105 664h636q88 0 157.5 -25t116 -67.5t78.5 -104t47 -130t19 -150.5t-2 -161t-20 -164q-62 -377 -200 -537t-403 -160h-666l109 693h-133zM492 291h269q112 0 178.5 113t102.5 341q23 141 24.5 233t-18.5 142t-53.5 69.5t-88.5 19.5h-269l-59 -374 h208l-23 -142h-208z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1376" d="M110 0l238 1499h338l373 -886l139 886h335l-237 -1499h-334l-377 871l-137 -871h-338zM624 1754q144 146 273 146q48 -1 108.5 -36t96.5 -35q51 -3 109.5 22t95.5 57l29 -135q-140 -144 -255 -143q-40 0 -79 18t-74.5 35.5t-67.5 17.5q-57 -1 -101 -17.5t-103 -53.5z" />
+<glyph unicode="&#xd2;" d="M178 519.5q2 114.5 25 258.5q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q82 0 145.5 -8t126.5 -30.5t106.5 -60t78 -99.5t49.5 -145.5t13 -200.5t-25 -264q-30 -194 -82 -327.5t-110.5 -208t-151 -114t-173 -49.5t-207.5 -10 q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 96t-49.5 141t-12.5 196zM516 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178t-1 126.5t-21.5 83.5t-45 48.5t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5 t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -160.5t-2 -116.5zM646 1920h267l138 -288h-203z" />
+<glyph unicode="&#xd3;" d="M178 519.5q2 114.5 25 258.5q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q82 0 145.5 -8t126.5 -30.5t106.5 -60t78 -99.5t49.5 -145.5t13 -200.5t-25 -264q-30 -194 -82 -327.5t-110.5 -208t-151 -114t-173 -49.5t-207.5 -10 q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 96t-49.5 141t-12.5 196zM516 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178t-1 126.5t-21.5 83.5t-45 48.5t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5 t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -160.5t-2 -116.5zM848 1632l219 288h271l-287 -288h-203z" />
+<glyph unicode="&#xd4;" d="M178 519.5q2 114.5 25 258.5q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q82 0 145.5 -8t126.5 -30.5t106.5 -60t78 -99.5t49.5 -145.5t13 -200.5t-25 -264q-30 -194 -82 -327.5t-110.5 -208t-151 -114t-173 -49.5t-207.5 -10 q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 96t-49.5 141t-12.5 196zM516 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178t-1 126.5t-21.5 83.5t-45 48.5t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5 t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -160.5t-2 -116.5zM628 1632l258 282h238l148 -282h-204l-76 121l-136 -121h-228z" />
+<glyph unicode="&#xd5;" d="M178 519.5q2 114.5 25 258.5q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q82 0 145.5 -8t126.5 -30.5t106.5 -60t78 -99.5t49.5 -145.5t13 -200.5t-25 -264q-30 -194 -82 -327.5t-110.5 -208t-151 -114t-173 -49.5t-207.5 -10 q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 96t-49.5 141t-12.5 196zM516 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178t-1 126.5t-21.5 83.5t-45 48.5t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5 t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -160.5t-2 -116.5zM615 1756q145 147 273 147q48 -1 108 -36.5t96 -35.5q51 -3 109.5 22t95.5 57l29 -135q-139 -143 -255 -142q-40 0 -79 18t-74.5 35.5t-67.5 17.5q-57 -1 -100 -17.5t-103 -54.5z" />
+<glyph unicode="&#xd6;" d="M178 519.5q2 114.5 25 258.5q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q82 0 145.5 -8t126.5 -30.5t106.5 -60t78 -99.5t49.5 -145.5t13 -200.5t-25 -264q-30 -194 -82 -327.5t-110.5 -208t-151 -114t-173 -49.5t-207.5 -10 q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 96t-49.5 141t-12.5 196zM516 462q4 -52 17.5 -82t42.5 -49.5t68 -26.5t98 -7q81 0 133 17.5t94.5 66.5t69.5 134t49 224q17 104 23 178t-1 126.5t-21.5 83.5t-45 48.5t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5 t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -160.5t-2 -116.5zM584 1760q8 52 50.5 88.5t95.5 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83 37.5t-23 90.5zM1106 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51.5 -90.5t-95.5 -37.5 t-83 37.5t-23 90.5z" />
+<glyph unicode="&#xd7;" horiz-adv-x="946" d="M160 525l234 203l-170 204l212 187l171 -204l251 214l163 -195l-254 -218l172 -203l-209 -174l-167 196l-236 -212z" />
+<glyph unicode="&#xd8;" d="M68 0l157 183q-41 85 -49 240t24 362q23 148 58 261t72.5 189.5t94 129t104.5 80.5t123.5 43t130.5 18t145 3q125 0 214.5 -16.5t152.5 -60.5l57 67h164l-135 -158q51 -87 62.5 -252t-22.5 -396q-22 -140 -54.5 -247.5t-69 -181t-90.5 -125t-103 -80t-122.5 -44 t-133.5 -19.5t-151 -4q-141 0 -235.5 18t-159.5 72l-71 -82h-163zM520 524l540 638q-44 42 -176 42q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5t-47 -82.5t-41 -127.5t-34.5 -183q-23 -143 -16 -215zM544 362q24 -36 71 -50.5t126 -14.5q108 0 169.5 34.5t103.5 129t71 278.5 q30 194 19 285z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1337" d="M193 503.5q3 86.5 19 188.5l131 807h336l-135 -853q-20 -121 -15 -199t51.5 -115t148.5 -37q75 0 126 21.5t83 69.5t50 107.5t33 152.5l135 853h338l-127 -899q-15 -93 -37.5 -170.5t-49 -136t-62.5 -104.5t-71 -77.5t-81 -54.5t-87 -35.5t-95 -20t-98.5 -9.5t-102.5 -2 q-53 0 -97 3.5t-92 13.5t-85.5 26t-74.5 44t-63 65t-46 90t-27.5 119t-4.5 152.5zM636 1920h267l137 -288h-203z" />
+<glyph unicode="&#xda;" horiz-adv-x="1337" d="M193 503.5q3 86.5 19 188.5l131 807h336l-135 -853q-20 -121 -15 -199t51.5 -115t148.5 -37q75 0 126 21.5t83 69.5t50 107.5t33 152.5l135 853h338l-127 -899q-15 -93 -37.5 -170.5t-49 -136t-62.5 -104.5t-71 -77.5t-81 -54.5t-87 -35.5t-95 -20t-98.5 -9.5t-102.5 -2 q-53 0 -97 3.5t-92 13.5t-85.5 26t-74.5 44t-63 65t-46 90t-27.5 119t-4.5 152.5zM837 1632l219 288h272l-288 -288h-203z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1337" d="M193 503.5q3 86.5 19 188.5l131 807h336l-135 -853q-20 -121 -15 -199t51.5 -115t148.5 -37q75 0 126 21.5t83 69.5t50 107.5t33 152.5l135 853h338l-127 -899q-15 -93 -37.5 -170.5t-49 -136t-62.5 -104.5t-71 -77.5t-81 -54.5t-87 -35.5t-95 -20t-98.5 -9.5t-102.5 -2 q-53 0 -97 3.5t-92 13.5t-85.5 26t-74.5 44t-63 65t-46 90t-27.5 119t-4.5 152.5zM617 1632l259 282h237l149 -282h-204l-77 121l-135 -121h-229z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1337" d="M193 503.5q3 86.5 19 188.5l131 807h336l-135 -853q-20 -121 -15 -199t51.5 -115t148.5 -37q75 0 126 21.5t83 69.5t50 107.5t33 152.5l135 853h338l-127 -899q-15 -93 -37.5 -170.5t-49 -136t-62.5 -104.5t-71 -77.5t-81 -54.5t-87 -35.5t-95 -20t-98.5 -9.5t-102.5 -2 q-53 0 -97 3.5t-92 13.5t-85.5 26t-74.5 44t-63 65t-46 90t-27.5 119t-4.5 152.5zM573 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51.5 -90.5t-95.5 -37.5t-83 37.5t-23 90.5zM1095 1760q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5 t-95 -37.5t-83.5 37.5t-23.5 90.5z" />
+<glyph unicode="&#xdd;" d="M276 1499h365l139 -693l385 693h381l-652 -1059l-70 -440h-336l71 440zM831 1632l220 288h271l-288 -288h-203z" />
+<glyph unicode="&#xde;" horiz-adv-x="1110" d="M83 0q39 249 117.5 746.5t117.5 746.5h336l-45 -289h265q41 0 78.5 -8.5t77 -28.5t67.5 -53.5t50.5 -84t25.5 -120t-8 -161.5q-10 -69 -26.5 -126t-34.5 -99t-43.5 -75t-48 -55t-54 -38t-55 -24.5t-58 -13.5t-56 -6.5t-54.5 -2.5q-48 -1 -87.5 -0.5t-84 10t-88.5 29.5 l-56 -347h-336zM514 598h142q46 0 70.5 4.5t46.5 21.5t33.5 49.5t20.5 90.5q4 27 4.5 48t-3.5 36.5t-9 26.5t-15.5 18t-19.5 11.5t-24 6.5t-26 2.5t-28 0.5h-143z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1173" d="M83 0l184 1159q14 93 53 170t105.5 140t172 98t241.5 35q106 0 189.5 -21t136.5 -57t87 -85t44.5 -105t4.5 -116.5t-28 -120t-57 -115t-80 -102.5q-25 -25 -67.5 -53.5t-66 -52.5t-29.5 -59q-4 -27 13 -51t46.5 -41.5t62.5 -43t61 -53.5t42 -74.5t5 -104.5l-9 -50 q-49 -313 -402 -313q-139 0 -279 39l35 231q125 -11 185 -11q49 0 86 25t46 82l5 28q5 31 -11.5 55.5t-44 40.5t-59 37.5t-58 45t-40 65t-5.5 95.5q15 97 57 151.5t142 123.5q90 69 103 160q13 89 -22.5 119.5t-119.5 30.5q-106 0 -156.5 -60.5t-75.5 -220.5l-161 -1021 h-336z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1114" d="M128.5 341q-8.5 119 22.5 281q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5q141 4 286 -27t217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-105.5 116.5t-51 197.5zM418 1520h267l137 -288h-203zM464 413 q-2 -68 23.5 -108t81.5 -40q75 0 120.5 26t76.5 78l69 465q-33 14 -82 18.5t-88 -4.5q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1114" d="M128.5 341q-8.5 119 22.5 281q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5q141 4 286 -27t217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-105.5 116.5t-51 197.5zM464 413q-2 -68 23.5 -108t81.5 -40q75 0 120.5 26 t76.5 78l69 465q-33 14 -82 18.5t-88 -4.5q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158zM620 1232l220 288h271l-288 -288h-203z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1114" d="M128.5 341q-8.5 119 22.5 281q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5q141 4 286 -27t217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-105.5 116.5t-51 197.5zM395 1232l258 281h238l148 -281h-203l-77 121 l-135 -121h-229zM464 413q-2 -68 23.5 -108t81.5 -40q75 0 120.5 26t76.5 78l69 465q-33 14 -82 18.5t-88 -4.5q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1114" d="M128.5 341q-8.5 119 22.5 281q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5q141 4 286 -27t217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-105.5 116.5t-51 197.5zM394 1356q144 146 273 146q48 -1 108.5 -36 t96.5 -35q51 -3 109.5 22t95.5 57l29 -135q-140 -144 -255 -143q-40 0 -79 18.5t-74.5 36t-67.5 17.5q-57 -1 -100.5 -18t-103.5 -54zM464 413q-2 -68 23.5 -108t81.5 -40q75 0 120.5 26t76.5 78l69 465q-33 14 -82 18.5t-88 -4.5q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46 t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1114" d="M128.5 341q-8.5 119 22.5 281q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5q141 4 286 -27t217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-105.5 116.5t-51 197.5zM358 1359q8 52 50.5 89t95.5 37q52 0 83 -36.5 t23 -89.5t-51 -90t-95 -37t-83 37t-23 90zM464 413q-2 -68 23.5 -108t81.5 -40q75 0 120.5 26t76.5 78l69 465q-33 14 -82 18.5t-88 -4.5q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158zM880 1359q8 52 51 89t96 37q52 0 83 -36.5 t23 -89.5q-8 -52 -51 -89.5t-96 -37.5q-52 0 -83 37t-23 90z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1114" d="M128.5 341q-8.5 119 22.5 281q19 94 48.5 169t62 124.5t77 86t82.5 56t90 31t89.5 15t89.5 4.5q141 4 286 -27t217 -100l-143 -978h-262l-52 108q-38 -56 -126.5 -89t-183.5 -33q-78 0 -141 38t-105.5 116.5t-51 197.5zM464 413q-2 -68 23.5 -108t81.5 -40q75 0 120.5 26 t76.5 78l69 465q-33 14 -82 18.5t-88 -4.5q-28 -6 -46.5 -13t-42.5 -25.5t-40 -46t-31.5 -76.5t-25.5 -116q-13 -90 -15 -158zM547 1438q7 87 72 146.5t152 59.5t143 -59.5t49 -146.5q-7 -88 -71 -147t-150 -59q-87 0 -144.5 59.5t-50.5 146.5zM675 1438q-3 -34 18.5 -56.5 t55.5 -22.5t58 22.5t27 56.5t-17 57t-54 23t-59.5 -23t-28.5 -57z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1699" d="M92.5 349.5q-8.5 120.5 22.5 279.5q15 75 36 137t43 107.5t52.5 82t56.5 60.5t62.5 41t64.5 26.5t68.5 15t67 7t68.5 2.5q86 3 189.5 -11t173.5 -42q110 50 281 53q73 1 136.5 -7t126.5 -29.5t106.5 -55.5t69 -91t22.5 -130q-4 -92 -32 -164.5t-72.5 -116.5t-99 -74 t-114.5 -41t-116.5 -15t-107 1.5t-84.5 12t-50 13.5q-16 -98 19 -131t146 -34q79 -2 196 9t208 28l-41 -238q-131 -41 -263.5 -56.5t-308.5 -2.5q-169 12 -243 141q-60 -76 -170.5 -108.5t-214.5 -32.5q-79 0 -142.5 40.5t-105.5 121.5t-50.5 201.5zM428 410.5 q-1 -37.5 4.5 -62.5t17 -45.5t32 -30.5t50.5 -10q61 -1 114 17.5t75 50.5q-9 132 23 301q22 124 56 203q-37 13 -85.5 17t-85.5 -3q-35 -8 -58 -19.5t-49.5 -39.5t-46 -83t-31.5 -138q-8 -50 -11.5 -85t-4.5 -72.5zM1089 629q11 -2 30 -5t68 -3.5t88.5 7.5t75.5 37t44 76 q11 62 -19 86t-101 22q-36 -1 -63 -8.5t-46 -24.5t-31 -33.5t-21.5 -46t-14 -50t-10.5 -57.5z" />
+<glyph unicode="&#xe7;" horiz-adv-x="1005" d="M139 319q-9 114 15 272q15 94 37 169t47 128t57.5 91.5t65 61t74 36t79 18t85.5 4.5q321 0 503 -70l-32 -203q-161 14 -343 14q-62 0 -89 -5t-60 -32.5t-52 -89.5t-38 -173q-13 -80 -15 -132t4.5 -84.5t29 -49t49.5 -21.5t75 -5q84 0 175 4.5t140 9.5l49 4l-32 -204 q-41 -22 -88.5 -37.5t-87 -22.5t-93.5 -10.5t-87.5 -3.5t-92 0.5t-85.5 0.5q-79 0 -139 35t-101 108t-50 187zM250 -371l21 140l90 31q44 18 56.5 39.5t22.5 83.5h214q-25 -160 -87.5 -227t-196.5 -67h-120z" />
+<glyph unicode="&#xe8;" horiz-adv-x="1081" d="M155 631q20 107 44 178.5t64 132t98.5 94.5t144 52.5t205.5 19.5q72 1 134 -7t121 -29.5t99.5 -56t63.5 -90.5t20 -130q-4 -92 -32 -164.5t-72.5 -116.5t-99 -74t-114.5 -41t-116.5 -15t-107 1.5t-84.5 12t-50 13.5q-16 -99 18.5 -131.5t145.5 -33.5q80 -2 205.5 9.5 t215.5 27.5l-41 -238q-265 -82 -587 -59q-194 13 -262.5 178.5t-12.5 466.5zM432 1519h267l137 -288h-203zM500 629q6 -1 16 -3t39 -4.5t56 -2t60.5 6.5t59.5 18.5t46.5 37.5t26.5 59q11 62 -18 86t-100 22q-36 -1 -63 -8.5t-46 -24.5t-31 -33.5t-21.5 -46t-14 -50 t-10.5 -57.5z" />
+<glyph unicode="&#xe9;" horiz-adv-x="1081" d="M155 631q20 107 44 178.5t64 132t98.5 94.5t144 52.5t205.5 19.5q72 1 134 -7t121 -29.5t99.5 -56t63.5 -90.5t20 -130q-4 -92 -32 -164.5t-72.5 -116.5t-99 -74t-114.5 -41t-116.5 -15t-107 1.5t-84.5 12t-50 13.5q-16 -99 18.5 -131.5t145.5 -33.5q80 -2 205.5 9.5 t215.5 27.5l-41 -238q-265 -82 -587 -59q-194 13 -262.5 178.5t-12.5 466.5zM500 629q6 -1 16 -3t39 -4.5t56 -2t60.5 6.5t59.5 18.5t46.5 37.5t26.5 59q11 62 -18 86t-100 22q-36 -1 -63 -8.5t-46 -24.5t-31 -33.5t-21.5 -46t-14 -50t-10.5 -57.5zM633 1231l220 288h271 l-288 -288h-203z" />
+<glyph unicode="&#xea;" horiz-adv-x="1081" d="M155 631q20 107 44 178.5t64 132t98.5 94.5t144 52.5t205.5 19.5q72 1 134 -7t121 -29.5t99.5 -56t63.5 -90.5t20 -130q-4 -92 -32 -164.5t-72.5 -116.5t-99 -74t-114.5 -41t-116.5 -15t-107 1.5t-84.5 12t-50 13.5q-16 -99 18.5 -131.5t145.5 -33.5q80 -2 205.5 9.5 t215.5 27.5l-41 -238q-265 -82 -587 -59q-194 13 -262.5 178.5t-12.5 466.5zM414 1231l258 281h237l149 -281h-204l-77 121l-135 -121h-228zM500 629q6 -1 16 -3t39 -4.5t56 -2t60.5 6.5t59.5 18.5t46.5 37.5t26.5 59q11 62 -18 86t-100 22q-36 -1 -63 -8.5t-46 -24.5 t-31 -33.5t-21.5 -46t-14 -50t-10.5 -57.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="1081" d="M155 631q20 107 44 178.5t64 132t98.5 94.5t144 52.5t205.5 19.5q72 1 134 -7t121 -29.5t99.5 -56t63.5 -90.5t20 -130q-4 -92 -32 -164.5t-72.5 -116.5t-99 -74t-114.5 -41t-116.5 -15t-107 1.5t-84.5 12t-50 13.5q-16 -99 18.5 -131.5t145.5 -33.5q80 -2 205.5 9.5 t215.5 27.5l-41 -238q-265 -82 -587 -59q-194 13 -262.5 178.5t-12.5 466.5zM367 1358q8 52 51 89t96 37q52 0 83 -36.5t23 -89.5t-51 -90t-95 -37t-83.5 37t-23.5 90zM500 629q6 -1 16 -3t39 -4.5t56 -2t60.5 6.5t59.5 18.5t46.5 37.5t26.5 59q11 62 -18 86t-100 22 q-36 -1 -63 -8.5t-46 -24.5t-31 -33.5t-21.5 -46t-14 -50t-10.5 -57.5zM890 1358q8 52 51 89t96 37q52 0 83 -36.5t23 -89.5q-8 -52 -51 -89.5t-96 -37.5q-52 0 -83 37t-23 90z" />
+<glyph unicode="&#xec;" horiz-adv-x="485" d="M61 0l172 1087h336l-172 -1087h-336zM117 1513h267l137 -288h-203z" />
+<glyph unicode="&#xed;" horiz-adv-x="485" d="M61 0l172 1087h336l-172 -1087h-336zM317 1225l220 288h271l-288 -288h-203z" />
+<glyph unicode="&#xee;" horiz-adv-x="485" d="M61 0l172 1087h336l-172 -1087h-336zM96 1225l259 282h237l149 -282h-204l-77 121l-135 -121h-229z" />
+<glyph unicode="&#xef;" horiz-adv-x="485" d="M50 1353q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51.5 -90.5t-95.5 -37.5t-83 37.5t-23 90.5zM61 0l172 1087h336l-172 -1087h-336zM572 1353q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1105" d="M121.5 338.5q-7.5 105.5 15.5 234.5q44 269 156 391.5t318 122.5h84q121 0 156 -15q-15 106 -78 172l-226 -106l-43 116l128 60q-85 23 -250 18l43 272q364 0 541 -124l182 85l45 -117l-131 -59q179 -236 75 -897q-19 -116 -51.5 -202.5t-74.5 -141.5t-98 -88.5 t-115.5 -46.5t-133.5 -13h-225q-103 0 -173.5 41.5t-103.5 116.5t-40.5 180.5zM466 350q15 -43 86 -42h97q48 -1 73 14t43.5 64t35.5 152q11 68 15 107t2.5 69.5t-13.5 43.5t-30.5 18.5t-51.5 5.5h-93q-46 0 -72.5 -18t-47.5 -71t-37 -155q-22 -145 -7 -188z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1130" d="M83 0l172 1087h275l43 -111q48 34 73 50t70.5 38.5t95 32t108.5 9.5q78 0 132 -20.5t83.5 -55t42.5 -86.5t11.5 -107t-12.5 -125l-113 -712h-336l113 718q11 70 -8 99.5t-67 29.5q-72 0 -123.5 -20t-102.5 -66l-121 -761h-336zM430 1353q144 146 273 146q48 -1 108 -36 t96 -35q51 -3 109.5 22t95.5 57l29 -135q-140 -144 -255 -143q-40 0 -79 18t-74.5 35.5t-67.5 17.5q-57 -1 -100.5 -17.5t-102.5 -53.5z" />
+<glyph unicode="&#xf2;" horiz-adv-x="1136" d="M150 567q21 134 53.5 226t77 153.5t113 95t149.5 47t198 13.5q275 0 370 -146t44 -466q-17 -103 -39 -177.5t-56 -131t-77 -92.5t-104.5 -58.5t-134.5 -31.5t-172 -9q-276 0 -372.5 139.5t-49.5 437.5zM440 1513h268l137 -288h-203zM470.5 403q-2.5 -49 2.5 -80.5t24 -47 t43.5 -21t67.5 -5.5q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 84 17.5 134.5t1.5 89.5t-20.5 57t-44 26t-72.5 8q-39 0 -64.5 -4t-47 -18.5t-35 -33.5t-26 -58.5t-21.5 -83.5t-21 -117q-13 -76 -15.5 -125z" />
+<glyph unicode="&#xf3;" horiz-adv-x="1136" d="M150 567q21 134 53.5 226t77 153.5t113 95t149.5 47t198 13.5q275 0 370 -146t44 -466q-17 -103 -39 -177.5t-56 -131t-77 -92.5t-104.5 -58.5t-134.5 -31.5t-172 -9q-276 0 -372.5 139.5t-49.5 437.5zM470.5 403q-2.5 -49 2.5 -80.5t24 -47t43.5 -21t67.5 -5.5 q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 84 17.5 134.5t1.5 89.5t-20.5 57t-44 26t-72.5 8q-39 0 -64.5 -4t-47 -18.5t-35 -33.5t-26 -58.5t-21.5 -83.5t-21 -117q-13 -76 -15.5 -125zM651 1225l219 288h272l-288 -288h-203z" />
+<glyph unicode="&#xf4;" horiz-adv-x="1136" d="M150 567q21 134 53.5 226t77 153.5t113 95t149.5 47t198 13.5q275 0 370 -146t44 -466q-17 -103 -39 -177.5t-56 -131t-77 -92.5t-104.5 -58.5t-134.5 -31.5t-172 -9q-276 0 -372.5 139.5t-49.5 437.5zM416 1225l258 282h238l148 -282h-204l-76 121l-136 -121h-228z M470.5 403q-2.5 -49 2.5 -80.5t24 -47t43.5 -21t67.5 -5.5q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 84 17.5 134.5t1.5 89.5t-20.5 57t-44 26t-72.5 8q-39 0 -64.5 -4t-47 -18.5t-35 -33.5t-26 -58.5t-21.5 -83.5t-21 -117q-13 -76 -15.5 -125z" />
+<glyph unicode="&#xf5;" horiz-adv-x="1136" d="M150 567q21 134 53.5 226t77 153.5t113 95t149.5 47t198 13.5q275 0 370 -146t44 -466q-17 -103 -39 -177.5t-56 -131t-77 -92.5t-104.5 -58.5t-134.5 -31.5t-172 -9q-276 0 -372.5 139.5t-49.5 437.5zM410 1349q145 147 273 147q48 -1 108.5 -36.5t96.5 -35.5 q51 -3 109.5 22t95.5 57l29 -135q-139 -143 -255 -142q-40 0 -79 18t-74.5 35.5t-67.5 17.5q-57 -1 -100 -17.5t-103 -54.5zM470.5 403q-2.5 -49 2.5 -80.5t24 -47t43.5 -21t67.5 -5.5q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 84 17.5 134.5t1.5 89.5 t-20.5 57t-44 26t-72.5 8q-39 0 -64.5 -4t-47 -18.5t-35 -33.5t-26 -58.5t-21.5 -83.5t-21 -117q-13 -76 -15.5 -125z" />
+<glyph unicode="&#xf6;" horiz-adv-x="1136" d="M150 567q21 134 53.5 226t77 153.5t113 95t149.5 47t198 13.5q275 0 370 -146t44 -466q-17 -103 -39 -177.5t-56 -131t-77 -92.5t-104.5 -58.5t-134.5 -31.5t-172 -9q-276 0 -372.5 139.5t-49.5 437.5zM382 1353q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5 q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5zM470.5 403q-2.5 -49 2.5 -80.5t24 -47t43.5 -21t67.5 -5.5q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 84 17.5 134.5t1.5 89.5t-20.5 57t-44 26t-72.5 8q-39 0 -64.5 -4t-47 -18.5t-35 -33.5 t-26 -58.5t-21.5 -83.5t-21 -117q-13 -76 -15.5 -125zM905 1353q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51.5 -90.5t-95.5 -37.5t-83 37.5t-23 90.5z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1003" d="M160 586l43 274h869l-43 -274h-869zM408 304l25 146q7 51 57 51h168q52 0 42 -51l-24 -146q-8 -47 -56 -47h-169q-22 0 -34 13t-9 34zM517 984l23 145q7 52 57 52h168q52 0 42 -52l-22 -145q-8 -48 -58 -48h-169q-22 0 -33 13t-8 35z" />
+<glyph unicode="&#xf8;" horiz-adv-x="1138" d="M38 0l141 144q-35 63 -41 177.5t15 242.5q18 112 42 194t60 142t79.5 97.5t106.5 60.5t133.5 31.5t168.5 8.5q206 0 306 -64l52 53h166l-138 -140q38 -67 45 -190t-17 -265q-25 -154 -64 -249t-109 -152.5t-165.5 -79t-244.5 -21.5q-213 0 -316 68l-56 -58h-164zM486 452 l332 348q-22 39 -115 39q-39 0 -64.5 -4t-47.5 -17.5t-35 -32.5t-25.5 -57.5t-21.5 -82.5t-21 -117q-8 -55 -2 -76zM490 291q13 -25 40.5 -33.5t79.5 -8.5q39 0 61 2.5t44.5 12.5t35 26.5t26 50t23 76.5t21.5 111q13 83 5 115z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1128" d="M115.5 249.5q1.5 55.5 12.5 126.5l113 711h336l-115 -717q-12 -73 8 -101t69 -28q72 0 123.5 20t102.5 66l121 760h336l-174 -1087h-275l-42 112q-58 -45 -98.5 -69.5t-104 -42.5t-142.5 -18q-78 0 -132 20.5t-84 54t-43 85.5t-11.5 107.5zM450 1513h267l137 -288h-203z " />
+<glyph unicode="&#xfa;" horiz-adv-x="1128" d="M115.5 249.5q1.5 55.5 12.5 126.5l113 711h336l-115 -717q-12 -73 8 -101t69 -28q72 0 123.5 20t102.5 66l121 760h336l-174 -1087h-275l-42 112q-58 -45 -98.5 -69.5t-104 -42.5t-142.5 -18q-78 0 -132 20.5t-84 54t-43 85.5t-11.5 107.5zM651 1225l219 288h272 l-288 -288h-203z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1128" d="M115.5 249.5q1.5 55.5 12.5 126.5l113 711h336l-115 -717q-12 -73 8 -101t69 -28q72 0 123.5 20t102.5 66l121 760h336l-174 -1087h-275l-42 112q-58 -45 -98.5 -69.5t-104 -42.5t-142.5 -18q-78 0 -132 20.5t-84 54t-43 85.5t-11.5 107.5zM431 1225l258 282h238 l148 -282h-203l-77 121l-135 -121h-229z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1128" d="M115.5 249.5q1.5 55.5 12.5 126.5l113 711h336l-115 -717q-12 -73 8 -101t69 -28q72 0 123.5 20t102.5 66l121 760h336l-174 -1087h-275l-42 112q-58 -45 -98.5 -69.5t-104 -42.5t-142.5 -18q-78 0 -132 20.5t-84 54t-43 85.5t-11.5 107.5zM385 1353q8 52 51 88.5 t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5zM908 1353q8 52 50.5 88.5t95.5 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83 37.5t-23 90.5z" />
+<glyph unicode="&#xfd;" horiz-adv-x="1163" d="M165 1087h348l45 -728q6 -73 92 -80l231 558q37 92 52 253h317q31 -159 -60 -369l-312 -720q-48 -109 -105 -198.5t-108.5 -148.5t-113.5 -105.5t-106 -71t-102.5 -44t-86.5 -25.5t-72 -13v236q132 66 212.5 155t144.5 214q-280 0 -307 296zM643 1218l219 288h272 l-288 -288h-203z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1138" d="M9 -553l342 2155h336l-101 -631q164 120 321 120q119 0 189 -75t85.5 -206.5t-9.5 -310.5q-16 -102 -35 -174.5t-52.5 -143t-79 -114t-115.5 -69.5t-161 -26q-74 0 -153.5 18.5t-135.5 53.5l-95 -597h-336zM474 259q57 -32 190 -36q24 0 42 6t38 25t35 51.5t30 87 t26 130.5q22 173 3.5 232t-78.5 57q-128 -3 -209 -60z" />
+<glyph unicode="&#xff;" horiz-adv-x="1163" d="M165 1087h348l45 -728q6 -73 92 -80l231 558q37 92 52 253h317q31 -159 -60 -369l-312 -720q-48 -109 -105 -198.5t-108.5 -148.5t-113.5 -105.5t-106 -71t-102.5 -44t-86.5 -25.5t-72 -13v236q132 66 212.5 155t144.5 214q-280 0 -307 296zM382 1315q8 52 51 88.5 t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51.5 -90.5t-95.5 -37.5t-83 37.5t-23 90.5zM904 1315q8 52 51 88.5t96 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90.5t-95 -37.5t-83.5 37.5t-23.5 90.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="2097" d="M140 519.5q2 114.5 25 258.5q23 148 58 261.5t72.5 190.5t93.5 130.5t104.5 82t123 44t130.5 19t145 3.5q251 0 362 -95q95 96 283 85q452 -8 629 -33l-44 -280h-542q-30 0 -52 -7t-34.5 -17t-21 -27t-11.5 -30t-6 -33l-25 -164l545 -22l-43 -278l-552 -19l-28 -176 q-3 -16 -3.5 -29.5t3 -23.5t5.5 -18t9.5 -13.5t11 -9.5t15 -6t15.5 -3.5t18 -2t17 -0.5h18h521l-43 -278q-72 -10 -227 -18.5t-274 -12.5l-118 -4q-64 -4 -130.5 15.5t-111.5 64.5q-79 -50 -177 -66t-239 -16q-83 0 -147 7.5t-127.5 29t-107 58t-78.5 96t-49.5 141 t-12.5 196zM478 462q4 -52 18 -82t43 -49.5t68 -26.5t98 -7q81 0 133 17.5t94 66.5t69 134t49 224q17 104 23 178t-1 126.5t-21.5 83.5t-45 48.5t-66 23t-90.5 5.5q-57 0 -92.5 -4.5t-72.5 -21t-60.5 -46.5t-47 -82.5t-41 -127.5t-34.5 -183q-15 -96 -21 -160.5t-2 -116.5z " />
+<glyph unicode="&#x153;" horiz-adv-x="1746" d="M138 568q18 112 42 194t60 142t79.5 97.5t107 60.5t134 31.5t168.5 8.5q203 0 300 -85q116 88 362 91q72 1 134 -7t121.5 -29.5t100 -56t63.5 -90.5t20 -130q-5 -105 -41 -184t-89.5 -122.5t-121.5 -69.5t-133.5 -32t-128 -3t-103.5 11t-60 16q-16 -99 18.5 -132 t145.5 -33q85 0 211 11t210 26l-41 -238q-265 -82 -587 -59q-121 7 -184 79q-117 -75 -366 -75q-276 0 -372.5 140t-49.5 438zM458.5 403q-2.5 -49 2.5 -80.5t24 -47t43.5 -21t67.5 -5.5q39 0 61 2.5t45 12.5t35.5 26.5t26 49.5t23 76.5t20.5 111.5q13 85 17.5 135t1.5 89 t-20 57t-43.5 26t-72.5 8q-47 0 -75.5 -8t-51 -24.5t-37.5 -56.5t-26.5 -89t-25.5 -137q-13 -76 -15.5 -125zM1179 629q11 -2 30 -5t68 -3.5t88.5 7.5t75.5 37t44 76q11 62 -18.5 86t-100.5 22q-42 -1 -73.5 -14t-49.5 -30.5t-31.5 -50t-19 -57t-13.5 -68.5z" />
+<glyph unicode="&#x178;" d="M254 1499h364l140 -693l385 693h381l-652 -1059l-70 -440h-336l71 440zM543 1757q8 52 51 89t96 37q52 0 83 -36.5t23 -89.5t-51 -90t-95 -37t-83.5 37t-23.5 90zM1065 1757q8 52 51 89t96 37q52 0 83 -36.5t23 -89.5t-51 -90t-95 -37t-83.5 37t-23.5 90z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="636" d="M91 1087l258 282h237l149 -282h-204l-77 121l-135 -121h-228z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="845" d="M241 1211q145 147 273 147q48 -1 108 -36t96 -35q51 -3 109.5 22t95.5 57l29 -136q-139 -143 -255 -142q-40 0 -79 18t-74.5 35.5t-67.5 17.5q-57 -1 -100 -17.5t-103 -54.5z" />
+<glyph unicode="&#x2000;" horiz-adv-x="960" />
+<glyph unicode="&#x2001;" horiz-adv-x="1920" />
+<glyph unicode="&#x2002;" horiz-adv-x="960" />
+<glyph unicode="&#x2003;" horiz-adv-x="1920" />
+<glyph unicode="&#x2004;" horiz-adv-x="640" />
+<glyph unicode="&#x2005;" horiz-adv-x="480" />
+<glyph unicode="&#x2006;" horiz-adv-x="320" />
+<glyph unicode="&#x2007;" horiz-adv-x="320" />
+<glyph unicode="&#x2008;" horiz-adv-x="240" />
+<glyph unicode="&#x2009;" horiz-adv-x="384" />
+<glyph unicode="&#x200a;" horiz-adv-x="106" />
+<glyph unicode="&#x2010;" horiz-adv-x="722" d="M124 457l43 274h643l-43 -274h-643z" />
+<glyph unicode="&#x2011;" horiz-adv-x="722" d="M124 457l43 274h643l-43 -274h-643z" />
+<glyph unicode="&#x2012;" horiz-adv-x="722" d="M124 457l43 274h643l-43 -274h-643z" />
+<glyph unicode="&#x2013;" horiz-adv-x="925" d="M121 451l45 276h969l-45 -276h-969z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1507" d="M127 455l45 276h1425l-45 -276h-1425z" />
+<glyph unicode="&#x2018;" horiz-adv-x="520" d="M272 1022l46 296q8 52 30.5 91t51.5 59t62.5 32.5t65 14.5t57.5 1.5t41 -3.5l16 -3l-22 -128q-22 0 -37.5 -6t-23 -18.5t-10.5 -20.5t-5 -20l-5 -38h23q23 0 35.5 -13t8.5 -39l-32 -205q-9 -57 -63 -57h-199q-49 0 -40 57z" />
+<glyph unicode="&#x2019;" horiz-adv-x="520" d="M274 972l20 129q22 0 37.5 6t22.5 18.5t10 20.5t5 20l7 37h-23q-23 0 -35.5 13t-8.5 39l33 206q9 57 60 57h200q51 0 42 -57l-49 -297q-8 -52 -30.5 -91t-51.5 -59t-61.5 -32.5t-64 -14.5t-57 -1.5t-40.5 3.5z" />
+<glyph unicode="&#x201a;" horiz-adv-x="520" d="M83 -231l20 128q22 0 37.5 6.5t23 18.5t10.5 20.5t5 20.5l6 36h-23q-23 0 -35.5 13.5t-8.5 39.5l33 206q9 56 61 56h199q51 0 42 -56l-48 -297q-8 -52 -30.5 -91t-51.5 -59t-62 -32.5t-64.5 -14.5t-57 -1.5t-41.5 3.5z" />
+<glyph unicode="&#x201c;" horiz-adv-x="874" d="M262 1019l46 296q8 52 30.5 91t51.5 59t62 32.5t64.5 14.5t57 1.5t40.5 -3.5l16 -3l-20 -128q-22 0 -37.5 -6t-22.5 -18.5t-10 -20.5t-5 -20l-6 -38h23q23 0 35.5 -13t8.5 -39l-32 -205q-9 -57 -63 -57h-199q-49 0 -40 57zM637 1019l47 296q8 52 30.5 91t51.5 59 t61.5 32.5t64 14.5t57 1.5t41.5 -3.5l15 -3l-19 -128q-22 0 -37.5 -6t-23 -18.5t-10.5 -20.5t-5 -20l-5 -38h23q23 0 35.5 -13t8.5 -39l-32 -205q-9 -57 -63 -57h-200q-49 0 -40 57z" />
+<glyph unicode="&#x201d;" horiz-adv-x="874" d="M264 969l20 129q22 0 37.5 6t22.5 18.5t10 20.5t5 20l7 37h-23q-23 0 -36 13t-9 39l33 206q9 56 61 56h199q51 0 42 -56l-48 -297q-8 -52 -30.5 -91t-51.5 -59t-61.5 -32.5t-64 -14.5t-57 -1.5t-40.5 3.5zM639 969l20 129q22 0 37.5 6t22.5 18.5t10 20.5t5 20l7 37h-23 q-23 0 -35.5 13t-8.5 39l33 206q9 56 60 56h200q51 0 42 -56l-48 -297q-8 -52 -30.5 -91t-51.5 -59t-62 -32.5t-64.5 -14.5t-57 -1.5t-41.5 3.5z" />
+<glyph unicode="&#x201e;" horiz-adv-x="872" d="M73 -231l20 129q22 0 37.5 6t22.5 18.5t10 20.5t5 20l7 37h-23q-23 0 -35.5 13.5t-8.5 39.5l33 205q9 57 61 57h199q51 0 42 -57l-48 -296q-8 -52 -30.5 -91t-51.5 -59.5t-62 -33t-64.5 -14.5t-57 -1.5t-41.5 3.5zM449 -231l19 129q22 0 37.5 6t23 18.5t10.5 20.5t5 20 l6 37h-23q-23 0 -35.5 13.5t-8.5 39.5l33 205q9 57 61 57h199q51 0 42 -57l-48 -296q-8 -52 -30.5 -91t-51.5 -59.5t-61.5 -33t-64 -14.5t-57 -1.5t-41.5 3.5z" />
+<glyph unicode="&#x2022;" horiz-adv-x="628" d="M219 645l41 271q5 33 26 52.5t54 19.5h259q69 0 59 -72l-41 -271q-11 -66 -84 -66h-259q-31 0 -45.5 17.5t-9.5 48.5z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1617" d="M263 47l34 209q7 51 57 51h201q52 0 43 -51l-34 -209q-8 -47 -57 -47h-201q-22 0 -34 13t-9 34zM820 47l34 209q7 51 58 51h200q52 0 43 -51l-34 -209q-8 -47 -57 -47h-201q-22 0 -34 13t-9 34zM1377 47l34 209q7 51 58 51h200q52 0 43 -51l-33 -209q-8 -47 -58 -47h-201 q-22 0 -34 13t-9 34z" />
+<glyph unicode="&#x202f;" horiz-adv-x="384" />
+<glyph unicode="&#x2039;" horiz-adv-x="579" d="M27 725l488 416l149 -174l-289 -246l212 -247l-195 -175z" />
+<glyph unicode="&#x203a;" horiz-adv-x="731" d="M183 477l291 249l-209 245l200 170l357 -419l-495 -423z" />
+<glyph unicode="&#x205f;" horiz-adv-x="480" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1431" d="M105 507l25 158l152 14l18 115l-146 16l23 149l152 19q5 33 10 58t17 69t26.5 78.5t39.5 79t55.5 78t75 68t97 57t123 36.5t151.5 14q104 0 267 -20t269 -57l-39 -244q-283 31 -451 31q-39 0 -71.5 -2.5t-58.5 -9t-46.5 -12.5t-36.5 -19t-27.5 -22.5t-21 -29t-15.5 -32 t-11.5 -37t-8.5 -39.5t-8 -45l477 -14l-25 -156l-482 -14l-17 -115l477 -14l-25 -158q-31 -1 -81.5 -2t-157 -3.5t-176 -5t-67.5 -3.5q-6 -35 -5.5 -64t5 -51t15 -39.5t22.5 -29.5t30 -21t35 -14t40 -7.5t42.5 -3.5t45.5 -1q81 0 199 12.5t195 25.5l78 12l-39 -237 q-110 -51 -244 -69t-325 -18q-60 0 -114 7.5t-125.5 38t-118 81t-70 148.5t-2.5 230z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1280" d="M70 1322l28 177h592l-28 -177h-191l-84 -538h-208l84 538h-193zM596 784l199 715h215l31 -383l143 383h227l-18 -715h-208l18 365l-112 -365h-185l-15 362l-87 -362h-208z" />
+<glyph unicode="&#xe000;" horiz-adv-x="1085" d="M0 0v1085h1085v-1085h-1085z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="2088" d="M159 844l34 209l207 34l29 183q7 44 22.5 86.5t45 85.5t69 75t98.5 52t130 20q170 0 277 -48l-32 -198l-157 2q-35 1 -57.5 -8t-35.5 -30t-20 -43.5t-15 -60.5l-3 -15l-17 -101h410l10 72q30 192 175.5 319.5t356.5 131.5q112 2 279.5 -11t220.5 -38l-30 -195l-383 1 q-38 0 -69.5 -4t-69 -18t-65 -37t-50 -65t-31.5 -99l-8 -57l695 -20l-167 -1067h-337l134 844h-365l-133 -844h-336l133 844h-409l-133 -844h-338l134 844h-199z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="2269" d="M159 844l34 209l207 34l29 183q7 44 22.5 86.5t45 85.5t69 75t98.5 52t130 20q170 0 277 -48l-32 -198l-157 2q-30 1 -51 -7t-33.5 -18.5t-22 -34.5t-13.5 -42t-11 -55l-17 -101h417l14 88q16 99 48.5 175t77 124.5t104 79t124 43t142.5 13.5l631 -5l-182 -1156 q-9 -56 -9.5 -92t8 -58t20.5 -33t34 -22q99 -43 113 -43l-31 -201h-211q-331 0 -271 387l155 979l-231 1q-85 0 -126.5 -41t-59.5 -151l-14 -88h226l-40 -243h-227l-133 -844h-336l134 844h-416l-133 -844h-338l134 844h-199z" />
+<hkern g1="P" 	g2="comma,period,ellipsis" 	k="328" />
+<hkern g1="P" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="184" />
+<hkern g1="P" 	g2="J" 	k="123" />
+<hkern g1="P" 	g2="X" 	k="61" />
+<hkern g1="P" 	g2="M" 	k="31" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="102" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="T" 	k="195" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="Y" 	k="307" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="V" 	k="246" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="41" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="184" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="W" 	k="246" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="92" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="S" 	k="41" />
+<hkern g1="quoteleft,quotedblleft" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="184" />
+<hkern g1="F" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="20" />
+<hkern g1="F" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="184" />
+<hkern g1="F" 	g2="comma,period,ellipsis" 	k="307" />
+<hkern g1="L" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="82" />
+<hkern g1="L" 	g2="T" 	k="317" />
+<hkern g1="L" 	g2="Y" 	k="205" />
+<hkern g1="L" 	g2="V" 	k="236" />
+<hkern g1="L" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="205" />
+<hkern g1="L" 	g2="comma,period,ellipsis" 	k="41" />
+<hkern g1="L" 	g2="W" 	k="205" />
+<hkern g1="L" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="51" />
+<hkern g1="L" 	g2="S" 	k="41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="T" 	k="41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="Y" 	k="92" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="V" 	k="72" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="20" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="102" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="comma,period,ellipsis" 	k="51" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="W" 	k="92" />
+<hkern g1="T" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="20" />
+<hkern g1="T" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="276" />
+<hkern g1="T" 	g2="comma,period,ellipsis" 	k="164" />
+<hkern g1="V" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="72" />
+<hkern g1="V" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="41" />
+<hkern g1="V" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="297" />
+<hkern g1="V" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="V" 	g2="S" 	k="41" />
+<hkern g1="Y,Yacute" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="92" />
+<hkern g1="Y,Yacute" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="82" />
+<hkern g1="Y,Yacute" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="338" />
+<hkern g1="Y,Yacute" 	g2="comma,period,ellipsis" 	k="276" />
+<hkern g1="Y,Yacute" 	g2="S" 	k="51" />
+<hkern g1="X" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="72" />
+<hkern g1="X" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="61" />
+<hkern g1="X" 	g2="S" 	k="41" />
+<hkern g1="W" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="72" />
+<hkern g1="W" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="61" />
+<hkern g1="W" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="297" />
+<hkern g1="W" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="W" 	g2="S" 	k="41" />
+<hkern g1="K" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="82" />
+<hkern g1="K" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="61" />
+<hkern g1="K" 	g2="S" 	k="41" />
+<hkern g1="M" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="-20" />
+<hkern g1="M" 	g2="Y" 	k="20" />
+<hkern g1="M" 	g2="V" 	k="41" />
+<hkern g1="M" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="-41" />
+<hkern g1="M" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="20" />
+<hkern g1="M" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="-41" />
+<hkern g1="M" 	g2="comma,period,ellipsis" 	k="-20" />
+<hkern g1="M" 	g2="W" 	k="20" />
+<hkern g1="M" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="-20" />
+<hkern g1="M" 	g2="S" 	k="-20" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="-20" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="72" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="comma,period,ellipsis" 	k="41" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="S" 	k="-20" />
+<hkern g1="B" 	g2="T" 	k="20" />
+<hkern g1="B" 	g2="Y" 	k="61" />
+<hkern g1="B" 	g2="V" 	k="41" />
+<hkern g1="B" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="20" />
+<hkern g1="B" 	g2="W" 	k="41" />
+<hkern g1="B" 	g2="S" 	k="-20" />
+<hkern g1="S" 	g2="T" 	k="41" />
+<hkern g1="S" 	g2="Y" 	k="41" />
+<hkern g1="S" 	g2="V" 	k="20" />
+<hkern g1="S" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="41" />
+<hkern g1="S" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="41" />
+<hkern g1="S" 	g2="W" 	k="20" />
+<hkern g1="S" 	g2="S" 	k="20" />
+<hkern g1="P,R" 	g2="Y" 	k="61" />
+<hkern g1="P,R" 	g2="V" 	k="41" />
+<hkern g1="P,R" 	g2="W" 	k="41" />
+<hkern g1="k" 	g2="comma,period,ellipsis" 	k="-20" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="comma,period,ellipsis" 	k="123" />
+<hkern g1="l" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="123" />
+<hkern g1="f" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="82" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="comma,period,ellipsis" 	k="41" />
+<hkern g1="x" 	g2="comma,period,ellipsis" 	k="41" />
+<hkern g1="s" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="s" 	g2="comma,period,ellipsis" 	k="20" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="comma,period,ellipsis" 	k="20" />
+<hkern g1="r" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="h,m,n,ntilde" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="l" 	k="51" />
+<hkern g1="c,ccedilla" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="C,Ccedilla" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="102" />
+<hkern g1="C,Ccedilla" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="41" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="v,w,y,yacute,ydieresis" 	k="164" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="102" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="s" 	k="20" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="f,t,uniFB03,uniFB04" 	k="61" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="quotesingle" 	k="164" />
+<hkern g1="quoteleft,quotedblleft" 	g2="J" 	k="164" />
+<hkern g1="quoteleft,quotedblleft" 	g2="M" 	k="61" />
+<hkern g1="quoteleft,quotedblleft" 	g2="v,w,y,yacute,ydieresis" 	k="-41" />
+<hkern g1="quoteleft,quotedblleft" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="F" 	g2="J" 	k="143" />
+<hkern g1="F" 	g2="M" 	k="82" />
+<hkern g1="F" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="F" 	g2="s" 	k="61" />
+<hkern g1="F" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="61" />
+<hkern g1="F" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="F" 	g2="p" 	k="41" />
+<hkern g1="F" 	g2="z" 	k="41" />
+<hkern g1="L" 	g2="v,w,y,yacute,ydieresis" 	k="123" />
+<hkern g1="L" 	g2="s" 	k="41" />
+<hkern g1="L" 	g2="f,t,uniFB03,uniFB04" 	k="102" />
+<hkern g1="L" 	g2="quotesingle" 	k="184" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="X" 	k="102" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="v,w,y,yacute,ydieresis" 	k="-41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="s" 	k="-20" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="quotesingle" 	k="41" />
+<hkern g1="T" 	g2="J" 	k="123" />
+<hkern g1="T" 	g2="M" 	k="82" />
+<hkern g1="T" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="T" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="82" />
+<hkern g1="T" 	g2="x" 	k="195" />
+<hkern g1="T" 	g2="v,w,y,yacute,ydieresis" 	k="205" />
+<hkern g1="T" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="287" />
+<hkern g1="T" 	g2="s" 	k="246" />
+<hkern g1="T" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="225" />
+<hkern g1="T" 	g2="f,t,uniFB03,uniFB04" 	k="115" />
+<hkern g1="T" 	g2="p" 	k="195" />
+<hkern g1="T" 	g2="z" 	k="184" />
+<hkern g1="V" 	g2="J" 	k="143" />
+<hkern g1="V" 	g2="M" 	k="123" />
+<hkern g1="V" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="V" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="123" />
+<hkern g1="V" 	g2="x" 	k="123" />
+<hkern g1="V" 	g2="v,w,y,yacute,ydieresis" 	k="61" />
+<hkern g1="V" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="174" />
+<hkern g1="V" 	g2="s" 	k="143" />
+<hkern g1="V" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="113" />
+<hkern g1="V" 	g2="f,t,uniFB03,uniFB04" 	k="102" />
+<hkern g1="V" 	g2="p" 	k="123" />
+<hkern g1="V" 	g2="z" 	k="102" />
+<hkern g1="Y,Yacute" 	g2="J" 	k="164" />
+<hkern g1="Y,Yacute" 	g2="M" 	k="123" />
+<hkern g1="Y,Yacute" 	g2="colon,semicolon" 	k="102" />
+<hkern g1="Y,Yacute" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="164" />
+<hkern g1="Y,Yacute" 	g2="x" 	k="133" />
+<hkern g1="Y,Yacute" 	g2="v,w,y,yacute,ydieresis" 	k="92" />
+<hkern g1="Y,Yacute" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="246" />
+<hkern g1="Y,Yacute" 	g2="s" 	k="205" />
+<hkern g1="Y,Yacute" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="143" />
+<hkern g1="Y,Yacute" 	g2="f,t,uniFB03,uniFB04" 	k="123" />
+<hkern g1="Y,Yacute" 	g2="p" 	k="184" />
+<hkern g1="Y,Yacute" 	g2="z" 	k="143" />
+<hkern g1="X" 	g2="M" 	k="41" />
+<hkern g1="X" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="123" />
+<hkern g1="X" 	g2="v,w,y,yacute,ydieresis" 	k="82" />
+<hkern g1="X" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="123" />
+<hkern g1="X" 	g2="s" 	k="41" />
+<hkern g1="X" 	g2="f,t,uniFB03,uniFB04" 	k="123" />
+<hkern g1="X" 	g2="p" 	k="41" />
+<hkern g1="X" 	g2="z" 	k="41" />
+<hkern g1="W" 	g2="J" 	k="123" />
+<hkern g1="W" 	g2="M" 	k="123" />
+<hkern g1="W" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="W" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="123" />
+<hkern g1="W" 	g2="x" 	k="82" />
+<hkern g1="W" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="164" />
+<hkern g1="W" 	g2="s" 	k="102" />
+<hkern g1="W" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="113" />
+<hkern g1="W" 	g2="f,t,uniFB03,uniFB04" 	k="82" />
+<hkern g1="W" 	g2="p" 	k="123" />
+<hkern g1="W" 	g2="z" 	k="82" />
+<hkern g1="K" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="123" />
+<hkern g1="K" 	g2="v,w,y,yacute,ydieresis" 	k="102" />
+<hkern g1="K" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="123" />
+<hkern g1="K" 	g2="s" 	k="61" />
+<hkern g1="K" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="20" />
+<hkern g1="K" 	g2="f,t,uniFB03,uniFB04" 	k="102" />
+<hkern g1="K" 	g2="p" 	k="41" />
+<hkern g1="K" 	g2="z" 	k="61" />
+<hkern g1="M" 	g2="J" 	k="-82" />
+<hkern g1="M" 	g2="M" 	k="-41" />
+<hkern g1="M" 	g2="colon,semicolon" 	k="-41" />
+<hkern g1="M" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-41" />
+<hkern g1="M" 	g2="x" 	k="-20" />
+<hkern g1="M" 	g2="v,w,y,yacute,ydieresis" 	k="-41" />
+<hkern g1="M" 	g2="s" 	k="-41" />
+<hkern g1="M" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="-41" />
+<hkern g1="M" 	g2="f,t,uniFB03,uniFB04" 	k="-20" />
+<hkern g1="M" 	g2="p" 	k="-41" />
+<hkern g1="M" 	g2="z" 	k="-41" />
+<hkern g1="M" 	g2="quotesingle" 	k="41" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-41" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="v,w,y,yacute,ydieresis" 	k="-61" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="-41" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="s" 	k="-20" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="f,t,uniFB03,uniFB04" 	k="-20" />
+<hkern g1="B" 	g2="J" 	k="-41" />
+<hkern g1="B" 	g2="X" 	k="20" />
+<hkern g1="B" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-41" />
+<hkern g1="B" 	g2="v,w,y,yacute,ydieresis" 	k="-61" />
+<hkern g1="B" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="-41" />
+<hkern g1="B" 	g2="s" 	k="-20" />
+<hkern g1="B" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="-20" />
+<hkern g1="B" 	g2="f,t,uniFB03,uniFB04" 	k="-20" />
+<hkern g1="S" 	g2="J" 	k="-41" />
+<hkern g1="S" 	g2="X" 	k="20" />
+<hkern g1="S" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-41" />
+<hkern g1="S" 	g2="x" 	k="41" />
+<hkern g1="S" 	g2="v,w,y,yacute,ydieresis" 	k="20" />
+<hkern g1="S" 	g2="f,t,uniFB03,uniFB04" 	k="31" />
+<hkern g1="S" 	g2="quotesingle" 	k="41" />
+<hkern g1="P,R" 	g2="J" 	k="-41" />
+<hkern g1="P,R" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-41" />
+<hkern g1="P,R" 	g2="v,w,y,yacute,ydieresis" 	k="-61" />
+<hkern g1="P,R" 	g2="s" 	k="-20" />
+<hkern g1="k" 	g2="colon,semicolon" 	k="-61" />
+<hkern g1="k" 	g2="x" 	k="-51" />
+<hkern g1="k" 	g2="v,w,y,yacute,ydieresis" 	k="-20" />
+<hkern g1="k" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="k" 	g2="s" 	k="-20" />
+<hkern g1="k" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="-31" />
+<hkern g1="k" 	g2="p" 	k="-31" />
+<hkern g1="k" 	g2="z" 	k="-31" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="v,w,y,yacute,ydieresis" 	k="-20" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="l" 	g2="v,w,y,yacute,ydieresis" 	k="41" />
+<hkern g1="l" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="61" />
+<hkern g1="l" 	g2="s" 	k="20" />
+<hkern g1="l" 	g2="f,t,uniFB03,uniFB04" 	k="61" />
+<hkern g1="l" 	g2="quotesingle" 	k="61" />
+<hkern g1="f" 	g2="x" 	k="20" />
+<hkern g1="f" 	g2="v,w,y,yacute,ydieresis" 	k="-20" />
+<hkern g1="f" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="f" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="41" />
+<hkern g1="f" 	g2="f,t,uniFB03,uniFB04" 	k="51" />
+<hkern g1="f" 	g2="p" 	k="41" />
+<hkern g1="f" 	g2="quotesingle" 	k="-41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-20" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="x" 	k="82" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="v,w,y,yacute,ydieresis" 	k="41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="31" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="quotesingle" 	k="123" />
+<hkern g1="x" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="61" />
+<hkern g1="x" 	g2="v,w,y,yacute,ydieresis" 	k="-20" />
+<hkern g1="x" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="82" />
+<hkern g1="x" 	g2="s" 	k="20" />
+<hkern g1="x" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="20" />
+<hkern g1="x" 	g2="p" 	k="20" />
+<hkern g1="s" 	g2="colon,semicolon" 	k="20" />
+<hkern g1="s" 	g2="x" 	k="20" />
+<hkern g1="s" 	g2="v,w,y,yacute,ydieresis" 	k="10" />
+<hkern g1="s" 	g2="s" 	k="20" />
+<hkern g1="s" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="s" 	g2="z" 	k="20" />
+<hkern g1="s" 	g2="quotesingle" 	k="61" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="hyphen,equal,uni00AD,endash,emdash" 	k="-20" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="x" 	k="20" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="f,t,uniFB03,uniFB04" 	k="51" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="quotesingle" 	k="61" />
+<hkern g1="r" 	g2="v,w,y,yacute,ydieresis" 	k="-41" />
+<hkern g1="r" 	g2="a,c,d,e,g,o,q,agrave,aacute,acircumflex,atilde,adieresis,aring,ae,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="31" />
+<hkern g1="h,m,n,ntilde" 	g2="v,w,y,yacute,ydieresis" 	k="-10" />
+<hkern g1="h,m,n,ntilde" 	g2="quotesingle" 	k="102" />
+</font>
+</defs></svg> 
\ No newline at end of file
Binary file Resources/font/exo/exo-bold.ttf has changed
Binary file Resources/font/exo/exo-bold.woff has changed
Binary file Resources/font/exo/exo-regular.eot has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/font/exo/exo-regular.svg	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,507 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="exoregular" horiz-adv-x="1372" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="512" />
+<glyph unicode="&#xfb01;" horiz-adv-x="1245" d="M41 936v117l201 34v109q0 183 110 298.5t293 115.5q70 0 187.5 -22t199.5 -48v-100l-352 22q-42 3 -80.5 -3t-77 -24t-66.5 -47.5t-45.5 -78.5t-17.5 -113v-109l740 -20v-1067h-154v936h-586v-936h-151v936h-201z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="1468" d="M41 936v117l203 34v109q0 68 11 128t36 113t63 91t95 60t129 22h550v-1223q0 -89 12 -135.5t34.5 -66t70.5 -33.5q168 -43 182 -43v-109h-180q-146 0 -208 86.5t-62 300.5v1075h-365q-53 0 -90 -11t-67 -39t-45 -81.5t-15 -134.5v-109h299v-151h-303v-936h-151v936h-199z " />
+<glyph horiz-adv-x="0" />
+<glyph unicode="&#xd;" horiz-adv-x="2048" />
+<glyph unicode=" "  horiz-adv-x="512" />
+<glyph unicode="&#x09;" horiz-adv-x="512" />
+<glyph unicode="&#xa0;" horiz-adv-x="512" />
+<glyph unicode="!" horiz-adv-x="550" d="M168 47v117q0 51 49 51h113q23 0 35 -14t12 -37v-117q0 -47 -47 -47h-113q-22 0 -35.5 12.5t-13.5 34.5zM180 1497h182l-14 -1096h-153z" />
+<glyph unicode="&#x22;" horiz-adv-x="778" d="M174 1362v137h154v-137l-21 -275h-110zM451 1362v137h153v-137l-20 -275h-111z" />
+<glyph unicode="#" horiz-adv-x="1406" d="M41 475l16 107h326l53 338h-325l18 106h324l75 473h107l-76 -473h340l74 473h106l-73 -473h362l-18 -106h-363l-53 -340h362l-16 -107h-362l-76 -473h-107l76 473l-340 2l-76 -475h-106l76 475h-324zM489 582l338 -2l54 340h-338z" />
+<glyph unicode="$" horiz-adv-x="1177" d="M113 1012v135q1 85 21 148.5t53.5 103.5t83.5 65t104.5 35.5t124.5 11.5v177h118v-183q75 -6 223.5 -23.5t168.5 -19.5v-119q-45 0 -168 4.5t-224 9.5l-100 5q-60 3 -101 -4t-78.5 -28t-56 -66.5t-18.5 -116.5v-135q0 -201 213 -201h266q82 0 142 -21t94 -53.5t54 -81.5 t26 -94t6 -102v-140q0 -82 -26 -144.5t-68 -99.5t-101.5 -59.5t-120.5 -29t-131 -2.5v-168h-118v178q-76 8 -203 24t-137 17v112q28 0 204 -6t285 -6q32 0 60.5 2.5t68 13.5t67.5 29.5t48 54.5t20 84v140q0 96 -38 148t-132 52h-266q-87 0 -153 21.5t-105.5 55.5t-64 82 t-33 94.5t-8.5 99.5z" />
+<glyph unicode="%" horiz-adv-x="1955" d="M86 971v272q0 136 57 196t207 60h207q146 0 203 -60.5t57 -195.5v-272q0 -136 -57 -196t-207 -60h-207q-146 0 -203 60.5t-57 195.5zM219 971q0 -74 26.5 -98.5t100.5 -24.5h207q85 0 108 24.5t23 98.5v272q0 74 -26.5 98.5t-100.5 24.5h-207q-85 0 -108 -24.5t-23 -98.5 v-272zM465 0l897 1499h145l-897 -1499h-145zM1139 260v272q0 136 57 196t207 60h207q146 0 203 -60.5t57 -195.5v-272q0 -136 -57 -196t-207 -60h-207q-146 0 -203 60.5t-57 195.5zM1272 260q0 -74 26.5 -98.5t100.5 -24.5h207q85 0 108 24.5t23 98.5v272q0 74 -26.5 98.5 t-100.5 24.5h-207q-85 0 -108 -24.5t-23 -98.5v-272z" />
+<glyph unicode="&#x26;" horiz-adv-x="1304" d="M72 475.5q24 157.5 161 274.5l177 149l-129 174q-79 112 -67 203.5t73.5 151.5t136.5 67q98 7 165 8.5t141.5 -7t124.5 -18t114 -24.5v-102h-416q-69 0 -112 -12.5t-62.5 -41t-4 -77.5t67.5 -119l482 -651l233 243l47 -49l-104 -219l-84 -92l239 -334h-180l-168 227 l-147 -137q-82 -76 -195 -94.5t-224 26.5t-181 146q-112 150 -88 307.5zM289 250q42 -53 104.5 -84t133.5 -26t124 55l164 153l-319 426l-160 -133q-214 -176 -47 -391z" />
+<glyph unicode="'" horiz-adv-x="378" d="M113 1362v137h153v-137l-20 -275h-111z" />
+<glyph unicode="(" horiz-adv-x="686" d="M154 668q0 157 33.5 327.5t81 301.5t95.5 239.5t82 166.5l33 58h166q-14 -22 -37 -61.5t-81.5 -162t-103.5 -245.5t-81.5 -295.5t-36.5 -328.5q0 -172 35 -348.5t85 -305t100 -233t85 -157.5l35 -54h-166q-13 18 -35 52.5t-78 147t-99 233t-78 302.5t-35 363z" />
+<glyph unicode=")" horiz-adv-x="686" d="M41 -430q7 10 19.5 29t47.5 81t67 129t71.5 169t67.5 204t47.5 231.5t19.5 254.5q0 156 -35 326t-85 301t-100 240t-85 167l-35 59h166q13 -22 35 -61t78 -161t99 -245t78 -296t35 -330q0 -181 -33.5 -361t-81 -307t-95.5 -228t-82 -152l-33 -50h-166z" />
+<glyph unicode="*" horiz-adv-x="901" d="M102 1159v82l285 59l10 -151zM242 848l49 276l147 -34l-121 -267zM360 1468l80 33l154 -241l-139 -64zM426 975l84 127l225 -187l-43 -65zM514 1169l246 156l39 -72l-187 -198z" />
+<glyph unicode="+" horiz-adv-x="1056" d="M102 653v152h349v350h151v-350h352v-152h-352v-350h-151v350h-349z" />
+<glyph unicode="," horiz-adv-x="552" d="M174 51v111q0 55 51 55h105q49 0 49 -55v-185q0 -55 -20 -91t-48.5 -49t-57.5 -17.5t-49 -1.5l-20 2v65q28 -1 43.5 11.5t18 24.5t2.5 28v51h-23q-23 0 -37 13t-14 38z" />
+<glyph unicode="-" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" />
+<glyph unicode="." horiz-adv-x="557" d="M174 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-22 0 -35.5 12.5t-13.5 34.5z" />
+<glyph unicode="/" horiz-adv-x="819" d="M41 -147l575 1724h162l-575 -1724h-162z" />
+<glyph unicode="0" horiz-adv-x="1316" d="M143 332v835q0 159 99.5 245.5t253.5 86.5h335q91 0 158.5 -26.5t107 -73.5t58.5 -105t19 -127v-835q0 -332 -343 -332h-335q-73 0 -134 18t-111.5 55.5t-79 103.5t-28.5 155zM295 332q0 -49 17 -85.5t47 -56.5t64 -29t73 -9h335q96 0 143.5 47t47.5 133v835 q0 181 -191 181h-335q-101 0 -151 -51t-50 -130v-835z" />
+<glyph unicode="1" horiz-adv-x="741" d="M82 1217v108l344 174h152v-1499h-152v1327z" />
+<glyph unicode="2" horiz-adv-x="1222" d="M82 1366v113q317 41 623 41q86 0 157 -25t118 -66.5t79 -97t46.5 -116t14.5 -125.5q0 -82 -33.5 -173t-85.5 -171t-123 -162.5t-139 -146.5t-141.5 -125.5t-121 -97t-87.5 -62.5h731v-152h-1024v139q61 41 119.5 83t149.5 112.5t168 137.5t160.5 151t141 160t95 158.5 t37.5 152.5q0 121 -65.5 196.5t-199.5 75.5h-620z" />
+<glyph unicode="3" horiz-adv-x="1216" d="M61 1352v94q84 30 195.5 44t220.5 14t236 -1q164 -3 257 -97.5t93 -240.5v-141q0 -110 -36 -182t-99 -97q135 -85 135 -294v-121q0 -344 -365 -344h-75h-79t-69.5 0.5t-75 2.5t-66 4.5t-71.5 7t-62 10t-67 14t-59 18.5l2 96h610q38 0 65.5 3t58.5 14.5t51 31.5t33 56 t13 86v121q0 112 -58 163t-151 54l-497 14v119l497 20q105 4 159 56.5t54 146.5v141q0 93 -62.5 140t-150.5 47h-637z" />
+<glyph unicode="4" horiz-adv-x="1234" d="M41 459l657 1040h181l-603 -956h582v424l76 153h76v-577h184v-121l-184 -39v-379h-152v379h-747z" />
+<glyph unicode="5" horiz-adv-x="1234" d="M156 41v113h622q51 0 88 16.5t57.5 45t30 60.5t9.5 68v225q0 28 -1.5 47t-11.5 49.5t-28 49t-55 33t-89 14.5h-315q-68 0 -118 -38.5t-50 -115.5h-135l45 891h864v-151h-725l-25 -496q39 47 152 61q49 6 109 6t120.5 -3t77.5 -3q173 0 254.5 -91t81.5 -249v-233 q0 -80 -23 -143.5t-58.5 -101t-82 -61.5t-88.5 -33t-84 -9q-207 0 -317.5 8t-304.5 41z" />
+<glyph unicode="6" horiz-adv-x="1275" d="M133 786q0 157 20.5 283t54.5 207t80 135.5t95 77t102 22.5q345 0 619 -38v-113h-592q-53 0 -94.5 -39t-65 -95.5t-39 -132.5t-21.5 -137t-7 -122q374 43 538 43q81 0 141 -17t95.5 -44t57 -68.5t29 -83t7.5 -93.5v-268q0 -305 -330 -305h-305q-71 1 -126 20.5 t-105.5 72.5t-83 139.5t-51.5 226.5t-19 329zM285 725q0 -46 1 -81t4 -89.5t9.5 -97t17.5 -92t28.5 -85t41 -67t57 -47.5t74.5 -16h305q44 0 73 5.5t55.5 22t39.5 50.5t13 87v256q0 154 -181 154h-538z" />
+<glyph unicode="7" horiz-adv-x="1118" d="M61 1348v151h940l56 -98l-543 -1401h-180l528 1348h-801z" />
+<glyph unicode="8" horiz-adv-x="1298" d="M154 315v201q0 54 14.5 93.5t43 63.5t53.5 37t63 25q-90 31 -132 112t-42 175v133q0 100 26 170.5t75.5 110t112.5 56.5t146 17h299q168 0 250 -84t82 -270v-133q1 -24 -3 -53t-17.5 -70t-48 -72.5t-85.5 -42.5q52 -9 89 -58.5t51.5 -105t13.5 -104.5v-201 q0 -76 -22.5 -134.5t-56.5 -91.5t-81 -54t-88.5 -28t-85.5 -7h-297q-72 0 -130.5 13.5t-95 33.5t-63.5 51t-40.5 57.5t-20.5 61t-8.5 54t-1.5 44.5zM305 309q0 -77 50 -117t159 -40h297q73 0 127.5 40.5t54.5 116.5v215q0 82 -51 124t-125 42h-325q-80 0 -133.5 -39 t-53.5 -127v-215zM305 1012q0 -48 19 -84t49 -54t59.5 -26t59.5 -8h325q176 0 176 172v139q0 112 -43.5 159.5t-136.5 47.5h-299q-55 0 -89 -6.5t-63.5 -27.5t-43 -63.5t-13.5 -109.5v-139z" />
+<glyph unicode="9" horiz-adv-x="1275" d="M123 938v268q0 305 330 305h305q71 -1 126 -20.5t105.5 -72.5t83 -139.5t51.5 -226.5t19 -329q0 -157 -20.5 -283t-54.5 -207t-80 -135.5t-95 -77t-102 -22.5q-431 0 -619 39v113h592q53 0 94.5 39t65 95.5t39 132.5t21.5 137t7 122q-374 -43 -538 -43q-81 0 -141 17 t-95.5 44t-57 68t-29 82.5t-7.5 93.5zM272 938q0 -154 181 -154h538q0 46 -1 81t-4 90t-9.5 97t-17.5 91.5t-28.5 85.5t-41 67.5t-57 47.5t-74.5 16h-305q-90 0 -135.5 -33t-45.5 -133v-256z" />
+<glyph unicode=":" horiz-adv-x="557" d="M174 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-22 0 -35.5 12.5t-13.5 34.5zM174 922v116q0 52 49 52h109q51 0 51 -52v-116q0 -48 -51 -48h-109q-22 0 -35.5 13t-13.5 35z" />
+<glyph unicode=";" horiz-adv-x="561" d="M174 51v111q0 23 14 39t37 16h105q23 0 36 -15.5t13 -39.5v-185q0 -55 -20 -91t-48.5 -49t-57.5 -17.5t-49 -1.5l-20 2v65q28 -1 43.5 11.5t18 24.5t2.5 28v51h-23q-21 0 -36 16t-15 35zM178 924v116q0 52 49 52h109q51 0 51 -52v-116q0 -47 -51 -47h-109 q-22 0 -35.5 12.5t-13.5 34.5z" />
+<glyph unicode="&#x3c;" horiz-adv-x="972" d="M102 643v164l768 332v-164l-565 -250l565 -270v-168z" />
+<glyph unicode="=" horiz-adv-x="956" d="M41 434v152h874v-152h-874zM41 862v152h874v-152h-874z" />
+<glyph unicode="&#x3e;" horiz-adv-x="972" d="M102 287v168l566 270l-566 250v164l768 -332v-164z" />
+<glyph unicode="?" horiz-adv-x="1107" d="M41 1360v113q21 3 83 11t83.5 10.5t72 8.5t80 7.5t75.5 3.5t90 1.5t93 -2.5q91 0 162 -20.5t116.5 -54.5t75 -83t42 -103t12.5 -117v-207q0 -101 -39 -173t-106.5 -107.5t-158 -48t-194.5 6.5v-207h-153v332h291q85 3 148 52.5t63 144.5v207q0 120 -66 172.5t-215 52.5 h-555zM348 47v117q0 51 49 51h113q23 0 35 -14t12 -37v-117q0 -47 -47 -47h-113q-22 0 -35.5 12.5t-13.5 34.5z" />
+<glyph unicode="@" horiz-adv-x="1728" d="M133 0v713q0 24 1 42.5t8 55.5t19 65.5t38 63t61 56.5t91 37.5t126 15.5h441q59 0 111 -14t99 -44.5t75 -89.5t28 -139v-762h-115l-29 131l-21 -15q-21 -16 -56 -38t-79 -43.5t-100 -37t-108 -15.5q-114 -3 -189 65.5t-73 173.5v109q0 125 69 198.5t195 73.5h358 q2 156 0 156q0 82 -41 110.5t-131 28.5h-434q-42 0 -72 -6t-59.5 -24t-45 -56.5t-15.5 -97.5v-713q0 -211 192 -211h715q121 0 166 50.5t45 160.5v1049q0 115 -57 174t-154 59h-827v96q286 58 589 56h238q168 -3 265 -100.5t97 -284.5v-1049q0 -365 -362 -365h-715 q-160 0 -252 94.5t-92 270.5zM612 233q0 -35 38.5 -68t86.5 -32q18 0 37 2t35 4t37.5 8.5t34 9.5t37 12.5t33.5 13t35.5 16t32 15t34 16t30.5 14.5v252l-348 -33q-60 -6 -92.5 -43.5t-30.5 -93.5v-93z" />
+<glyph unicode="A" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM469 569h489l-241 699z" />
+<glyph unicode="B" horiz-adv-x="1220" d="M164 0v1499h577q107 0 186 -36.5t121.5 -96t62 -124t19.5 -132.5q0 -274 -188 -332q78 -17 137.5 -108.5t59.5 -251.5q0 -67 -11 -124.5t-39 -112.5t-71.5 -94t-114.5 -63t-162 -24h-577zM317 152h424q35 0 64 4.5t64.5 20.5t59.5 44t41 79.5t17 121.5q0 123 -62 205 t-184 82h-424v-557zM317 860h424q117 0 177.5 62.5t60.5 187.5q0 71 -21.5 120.5t-58.5 73.5t-75 34t-83 10h-424v-488z" />
+<glyph unicode="C" horiz-adv-x="1183" d="M113 754q0 107 6 193.5t21.5 167t40.5 141t63.5 111t90 82.5t121 49.5t156.5 17.5q81 0 238 -16t262 -36v-121l-18 1q-18 1 -49 3t-71 4.5t-87 4.5t-93.5 4t-95 3t-86.5 1q-100 0 -163 -25.5t-106.5 -95t-61 -187.5t-17.5 -306q0 -611 348 -611q96 0 221 3.5t202 7.5 l77 4v-121q-100 -19 -255.5 -32t-244.5 -13q-499 0 -499 766z" />
+<glyph unicode="D" horiz-adv-x="1345" d="M164 0v1499h557q96 0 174.5 -26.5t132.5 -69.5t95.5 -105.5t65.5 -127.5t39 -143t20 -145t5 -139q0 -107 -17 -208.5t-57 -199.5t-99.5 -171.5t-152 -118.5t-206.5 -45h-557zM315 158h406q98 0 173 47t119.5 129t66.5 185.5t22 225.5q0 162 -25.5 278.5t-76 187.5 t-119.5 104t-160 33h-406v-1190z" />
+<glyph unicode="E" horiz-adv-x="1161" d="M164 252v981q0 73 20.5 127t57 84t82.5 44q40 12 84 11h14l647 -33v-118h-647q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l672 -20v-121l-672 -20v-410q0 -26 5 -45.5t16 -31t20 -18t27.5 -9t28 -3t30.5 -0.5h627v-116l-627 -35q-19 -1 -36 -1q-23 0 -45 2 q-37 4 -75 20t-63.5 44t-42 77t-16.5 116z" />
+<glyph unicode="F" horiz-adv-x="1161" d="M164 0v1233q0 73 20.5 127t57 84t82.5 44q40 12 84 11h14l647 -33v-118h-647q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l672 -20v-121l-672 -20v-662h-151z" />
+<glyph unicode="G" horiz-adv-x="1257" d="M113 758q0 94 5 171.5t18.5 157.5t36 142t59.5 117.5t86.5 91.5t118.5 57t155 21q80 0 246.5 -18t273.5 -38v-121q-2 0 -38 2.5t-92.5 6.5t-121.5 7.5t-138 6t-130 2.5q-81 0 -138 -24.5t-94 -70t-58.5 -122.5t-29.5 -169.5t-8 -223.5q0 -231 32 -362.5t104 -191 t200 -61.5h6q67 0 162 23q98 23 162 47l63 24v410h-344v102q185 52 357 52q66 0 139 -6v-791h-115l-33 100q-200 -110 -397 -110h-8q-84 0 -152 19q-72 20 -122.5 55t-87.5 90.5t-59 117t-35.5 144.5t-18 162t-4.5 180z" />
+<glyph unicode="H" horiz-adv-x="1306" d="M164 0v1499h151v-698h717v698h152v-1499h-152v649h-717v-649h-151z" />
+<glyph unicode="I" horiz-adv-x="438" d="M164 0v1499h151v-1499h-151z" />
+<glyph unicode="J" horiz-adv-x="735" d="M72 43l8 111q136 -33 195 -33h2q163 0 182 172q2 21 2 45v1161h151v-1161q0 -47 -2.5 -80.5t-12 -79.5t-32.5 -82t-59 -59q-79 -50 -206 -50q-6 0 -12 1q-136 2 -216 55z" />
+<glyph unicode="K" horiz-adv-x="1210" d="M164 0v1499h151v-672h168l471 672h185l-516 -747l516 -752h-185l-471 676h-166v-676h-153z" />
+<glyph unicode="L" horiz-adv-x="1140" d="M164 258v1241h151v-1241q0 -31 8.5 -52.5t18 -32t31 -15.5t32.5 -5.5t37 -0.5h627v-152h-627q-46 0 -81 4.5t-74.5 20t-64.5 42.5t-41.5 75.5t-16.5 115.5z" />
+<glyph unicode="M" horiz-adv-x="1640" d="M113 0l98 1499h209l399 -1247l387 1247h207l115 -1499h-152l-92 1225l-385 -1225h-156l-397 1225l-82 -1225h-151z" />
+<glyph unicode="N" horiz-adv-x="1392" d="M164 0v1499h155l799 -1216v1216h152v-1499h-152l-801 1217v-1217h-153z" />
+<glyph unicode="O" horiz-adv-x="1384" d="M133 739q0 116 9 211.5t24.5 169t41.5 131t54.5 98.5t69 70t79.5 46.5t92 27.5t101 13t111 3q65 0 113.5 -3t101.5 -13t92 -27.5t79 -46.5t67.5 -70t52.5 -98.5t39.5 -131t23 -169t8.5 -211.5q0 -110 -8 -200t-22 -161t-38 -126.5t-51 -96t-65.5 -69.5t-78.5 -47.5 t-93 -28.5t-104 -14t-117 -4q-67 0 -117.5 3t-104.5 12.5t-93 26.5t-79 45t-67 68t-51.5 95.5t-39 127t-22.5 164t-8 205.5zM285 739q0 -133 8.5 -227t31.5 -161.5t53 -107t82 -62.5t110 -30.5t145 -7.5q85 0 143 8.5t109 33t81.5 65.5t52.5 108t31 159.5t9 221.5 q0 91 -4 166t-14.5 133.5t-20.5 104t-31 79t-37.5 56.5t-48.5 38t-54.5 23.5t-64.5 12.5t-70.5 5t-80.5 1q-57 0 -87.5 -1t-76 -6.5t-69.5 -17t-57.5 -32.5t-50.5 -52t-37.5 -77.5t-29.5 -107.5t-15.5 -142.5t-6.5 -182.5z" />
+<glyph unicode="P" horiz-adv-x="1189" d="M123 0v1499h616q359 0 359 -434q0 -89 -12.5 -160t-31.5 -117.5t-49.5 -81t-59.5 -52.5t-68.5 -28.5t-69 -13t-68.5 -2.5q-58 0 -257.5 18t-207.5 23v-651h-151zM274 762h465q36 0 62.5 5t55 23.5t46.5 50t29.5 88.5t11.5 136q-1 76 -16.5 131.5t-36 83.5t-51 44t-52 19 t-49.5 3h-465v-584z" />
+<glyph unicode="Q" horiz-adv-x="1384" d="M133 739q0 116 8.5 211.5t23.5 169t40 131t53 98.5t67.5 70t78.5 46.5t92.5 27.5t102 13t112.5 3q65 0 113.5 -3t102 -13t92.5 -27.5t79.5 -46.5t68 -70t53 -98.5t40.5 -131t23.5 -169t8.5 -211.5q0 -140 -13.5 -249.5t-36.5 -188t-63 -134.5t-84 -89.5t-108 -53 t-127 -26t-149 -6.5q-67 0 -117 3t-104 12.5t-93 26.5t-78.5 45t-66.5 68t-51 95.5t-38 127t-22 164t-8 205.5zM285 739q0 -100 4.5 -176.5t16.5 -138t28 -105t43 -75.5t56.5 -51t74.5 -30.5t91.5 -15.5t111.5 -4q85 0 143.5 8.5t109.5 32.5t82 65.5t54 108.5t32 159.5 t9 221.5q0 91 -4 166t-14.5 133.5t-21 104t-32 79t-38 56.5t-49 38t-55 23.5t-65 12.5t-71 5t-80.5 1q-57 0 -87 -1t-75.5 -6.5t-69.5 -17t-57 -32.5t-49.5 -52t-36.5 -77.5t-29 -107.5t-15.5 -142.5t-6.5 -182.5zM649 -68h107q62 -44 120 -60q43 -12 81 -12q15 0 29 2 q50 6 114 29v-163q-44 -17 -100 -20q-11 -1 -22 -1q-45 0 -91 11q-57 12 -107 37.5t-86 71.5t-45 105z" />
+<glyph unicode="R" horiz-adv-x="1214" d="M123 0v1499h639q346 0 346 -450q0 -80 -12 -146t-29.5 -108.5t-43.5 -75.5t-48 -50.5t-51 -29.5t-43.5 -15t-32.5 -6l315 -618h-164l-315 612l-410 29v-641h-151zM274 776h488q21 0 32 0.5t30 3t30 7t26.5 14t24.5 23t19.5 34t16 47.5t9.5 63.5t4 80.5q0 77 -12 133.5 t-29.5 87t-44.5 48.5t-51 23t-55 5h-488v-570z" />
+<glyph unicode="S" horiz-adv-x="1196" d="M133 1012v135q0 73 14 130t41 96.5t62 67t82.5 42.5t97 21.5t109.5 6.5q130 0 512 -49v-123l-512 21q-24 1 -44.5 1t-37.5 -1q-33 -2 -68.5 -13.5t-56 -34t-34 -64t-13.5 -101.5v-135q0 -54 10.5 -92t27 -59t45.5 -32.5t56 -14.5t70 -3h290q79 0 137.5 -21t93 -54t55 -81 t27.5 -94t7 -102v-140q0 -84 -24.5 -146t-62 -97.5t-94.5 -57t-111 -28t-122 -6.5q-70 0 -252 19t-260 32v123q236 -23 512 -23q29 0 49.5 1.5t55 6t59 17t48.5 31.5t37 52t13 76v140q0 96 -37 148t-131 52h-286q-95 0 -163.5 21t-107 53t-60.5 81.5t-28 94t-6 103.5z" />
+<glyph unicode="T" horiz-adv-x="1183" d="M92 1348v151h1041v-151h-451v-1348h-152v1348h-438z" />
+<glyph unicode="U" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -85 6.5 -153t15 -119t28.5 -89.5t35 -64.5t47 -43t52 -26t62.5 -13.5t66.5 -4.5t75 -1h16q44 0 67.5 1t63 5.5t62 13.5t53.5 26.5t49 43t39 64.5t31.5 89.5t18 119t7.5 151.5v844h154v-844q0 -138 -18.5 -245t-44.5 -176.5t-74.5 -118t-87 -72.5 t-105 -36.5t-105.5 -14.5t-110 -2q-162 0 -226 11q-159 29 -235 158q-94 157 -94 496z" />
+<glyph unicode="V" d="M92 1499h166l438 -1257l459 1257h166l-551 -1499h-152z" />
+<glyph unicode="W" horiz-adv-x="1970" d="M92 1499h166l436 -1235l371 1235h172l-139 -479l272 -768l383 1247h166l-469 -1499h-152l-280 766l-248 -766h-152z" />
+<glyph unicode="X" horiz-adv-x="1220" d="M92 1499h166l369 -629l377 629h165l-442 -739l432 -760h-166l-366 631l-363 -631h-166l428 760z" />
+<glyph unicode="Y" horiz-adv-x="1290" d="M92 1499h166l387 -786l428 786h166l-518 -967v-532h-152v532z" />
+<glyph unicode="Z" horiz-adv-x="1153" d="M72 0v152l811 1196h-811v151h1009v-151l-811 -1196h811v-152h-1009z" />
+<glyph unicode="[" horiz-adv-x="657" d="M174 -78v1450q0 44 5 84.5t22.5 91.5t46 88t81.5 62.5t124 25.5h163v-151h-163q-58 0 -92.5 -54.5t-34.5 -146.5v-1450q0 -92 34.5 -146.5t92.5 -54.5h163v-151h-163q-71 0 -124 25.5t-81.5 62.5t-46 88t-22.5 91.5t-5 84.5z" />
+<glyph unicode="\" horiz-adv-x="819" d="M41 1577h162l575 -1724h-162z" />
+<glyph unicode="]" horiz-adv-x="657" d="M41 -279h164q58 0 92.5 54.5t34.5 146.5v1450q0 92 -34.5 146.5t-92.5 54.5h-164v151h164q59 0 106 -17t76.5 -47.5t49.5 -65t29.5 -77t13 -76t3.5 -69.5v-1450q0 -36 -3.5 -69.5t-13 -76t-29.5 -77t-49.5 -65t-76.5 -47.5t-106 -17h-164v151z" />
+<glyph unicode="^" horiz-adv-x="802" d="M102 1087l240 267h145l213 -267h-145l-143 146l-162 -146h-148zM487 1354z" />
+<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v152h1298v-152h-1298z" />
+<glyph unicode="`" horiz-adv-x="495" d="M41 1360h195l219 -273h-142z" />
+<glyph unicode="a" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q228 -1 341.5 -1t113.5 1q1 68 1 102.5t-1 35.5q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61h7q132 0 218 -76q88 -78 89 -239v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5 q-117 0 -194.5 72t-77.5 198zM233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103z" />
+<glyph unicode="b" horiz-adv-x="1134" d="M123 0v1608h147v-586q92 37 210 59.5t194 22.5q75 0 133.5 -22t97 -63.5t64.5 -92t39 -118t18.5 -130.5t5.5 -139q0 -82 -8.5 -154t-32.5 -147.5t-62.5 -128.5t-103.5 -87t-151 -34q-93 0 -222 48t-180 85l-41 -121h-108zM272 233q71 -29 120 -46t127.5 -32.5 t154.5 -15.5q101 0 154 101t53 299q0 99 -9 171t-25.5 118.5t-43 74t-57.5 38.5t-72 11q-115 0 -203.5 -12t-198.5 -41v-666z" />
+<glyph unicode="c" horiz-adv-x="1024" d="M102 545q0 139 18 239.5t47.5 160.5t77.5 95t98 46.5t118 11.5q77 0 216 -16.5t251 -37.5v-110q-285 12 -467 12q-31 0 -50.5 -2.5t-43.5 -11t-39 -25.5t-30.5 -46.5t-24 -73t-14 -106t-5.5 -144.5q0 -156 22 -242.5t65.5 -120t119.5 -33.5q84 0 204 5.5t199 11.5l78 6 v-115q-197 -56 -481 -59q-67 0 -116 11.5t-97.5 46.5t-78.5 95t-48.5 161.5t-18.5 240.5z" />
+<glyph unicode="d" horiz-adv-x="1134" d="M102 539q0 93 7.5 167t30.5 151.5t61 129t104.5 84.5t155.5 33q76 0 192.5 -22.5t208.5 -59.5v586h150v-1608h-109l-41 121q-51 -37 -179.5 -85t-221.5 -48q-86 0 -151 34t-104 87.5t-63 128.5t-32.5 147t-8.5 154zM254 539q0 -198 53 -299t154 -101q76 0 154 15.5 t127 32.5t120 46v666q-110 29 -198 41t-203 12q-41 0 -72 -11t-57.5 -38.5t-43 -74t-25.5 -118.5t-9 -171z" />
+<glyph unicode="e" horiz-adv-x="1075" d="M102 549q0 104 9 183t26 137.5t47 98.5t65 65.5t88.5 39t108 18.5t132.5 5q63 0 104.5 -2.5t89 -11t78 -24.5t60.5 -44.5t46.5 -69t26.5 -99t10 -134.5q0 -250 -280 -250h-459q0 -130 19 -198t62 -95t126 -27h55h57h51.5t54.5 0.5t49.5 1.5t53 2t47.5 2.5t50.5 3.5 t45.5 5t48 6v-115q-201 -57 -512 -57q-85 0 -144 17.5t-101.5 56t-67 105t-35.5 158t-11 222.5zM254 610h459q67 0 98 25t31 76q0 56 -3.5 92t-16 63.5t-28 41.5t-49 23t-69 11t-96.5 2q-62 0 -92 -1t-73 -7t-61.5 -19t-43 -36t-33.5 -59.5t-16 -88.5t-7 -123z" />
+<glyph unicode="f" horiz-adv-x="819" d="M41 936v117l199 34v203q0 31 1 53t6 58t14.5 62t28 55.5t44.5 48t66.5 31t91.5 12.5q128 0 286 -49v-101l-252 2h-7q-33 0 -57 -8q-26 -10 -40 -23t-21 -38.5t-8.5 -46t-1.5 -56.5v-203h303v-151h-303v-936h-151v936h-199z" />
+<glyph unicode="g" horiz-adv-x="1134" d="M92 -63l82 133q-76 55 -76 166q0 58 31.5 108.5t89.5 61.5q-62 39 -90.5 122t-28.5 177q0 191 93.5 289t261.5 98h639v-115l-166 -37q2 -3 15 -25t18 -34.5t14 -39t12.5 -60t3.5 -76.5q0 -44 -7 -89.5t-29 -103.5t-57 -102t-98.5 -74.5t-146.5 -30.5h-319q-84 0 -84 -61 q0 -70 84 -70h436q125 0 194.5 -76.5t69.5 -206.5v-129q0 -43 -6 -81t-25.5 -82.5t-51.5 -76.5t-89.5 -53.5t-134.5 -21.5h-307q-150 0 -239 80t-89 235v175zM244 39v-277q0 -53 16.5 -88t46 -50t55 -20t58.5 -5h307q86 0 121 42.5t35 120.5v119q0 77 -28 109.5t-112 32.5 h-407q-28 0 -51 4t-32 8zM252 705q0 -43 7.5 -82t26.5 -78.5t58.5 -63.5t95.5 -24h201q47 0 84 17t58.5 42.5t35 59.5t17.5 66q4 26 4 52v11q-2 58 -11 97.5t-30.5 72.5t-61 49t-98.5 16h-184q-203 0 -203 -235z" />
+<glyph unicode="h" horiz-adv-x="1114" d="M123 0v1606h151v-645q5 3 40 23.5t43 24.5t39 21t43.5 21.5t41 17t46.5 16.5t44.5 10.5t52 8.5t52.5 2q155 0 245.5 -102.5t90.5 -245.5v-758h-152v758q0 97 -50.5 146.5t-133.5 49.5q-79 0 -147 -15.5t-112 -34t-143 -66.5v-838h-151z" />
+<glyph unicode="i" horiz-adv-x="403" d="M102 1264v110q0 51 50 51h102q23 0 35 -14t12 -37v-110q0 -47 -47 -47h-102q-22 0 -36 13t-14 34zM123 0v1087h151v-1087h-151z" />
+<glyph unicode="j" horiz-adv-x="444" d="M123 1264v110q0 51 49 51h102q23 0 35.5 -14.5t12.5 -36.5v-110q0 -47 -48 -47h-102q-22 0 -35.5 12.5t-13.5 34.5zM145 -553v1640h152v-1095v-47q0 -326 -53 -498h-99z" />
+<glyph unicode="k" horiz-adv-x="1024" d="M123 0v1602h151v-902h82l416 387h211l-483 -462l483 -625h-188l-439 549h-82v-549h-151z" />
+<glyph unicode="l" horiz-adv-x="614" d="M123 387v1217h151v-1217q0 -124 29 -173t88 -62q168 -43 182 -43v-109h-180q-270 0 -270 387z" />
+<glyph unicode="m" horiz-adv-x="1839" d="M123 0v1087h106l45 -131q12 7 51 30t53.5 31t48.5 25.5t55 24.5t52.5 16.5t62.5 13t65 3.5q101 0 183.5 -43t117.5 -117q193 160 438 160q143 0 239.5 -98t96.5 -252v-750h-152v750q0 90 -51.5 144t-132.5 54q-124 0 -213.5 -24.5t-188.5 -89.5v-80v-754h-151v750 q0 89 -52.5 143.5t-133.5 54.5q-58 0 -101 -5.5t-96.5 -25t-81.5 -32t-109 -51.5v-834h-151z" />
+<glyph unicode="n" horiz-adv-x="1114" d="M123 0v1087h106l45 -126q5 3 40 23.5t43 24.5t39 21t43.5 21.5t41 17t46.5 16.5t44.5 10.5t52 8.5t52.5 2q155 0 245.5 -102.5t90.5 -245.5v-758h-152v758q0 97 -51 146.5t-133 49.5q-79 0 -147 -15.5t-112 -34t-143 -66.5v-838h-151z" />
+<glyph unicode="o" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q140 0 230 -27.5t146.5 -96t79.5 -174.5t23 -272q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5 t38 -34.5t44 -22t52.5 -12.5t59 -6t67.5 -1.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 73 -4 129.5t-14 100t-22 74t-34 51.5t-44 33.5t-57.5 19t-68.5 8.5t-83 2q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130z " />
+<glyph unicode="p" horiz-adv-x="1134" d="M123 -553v1640h108l39 -120q51 37 181 85t223 48q86 0 151 -34t103.5 -87t62.5 -128.5t32.5 -147.5t8.5 -154q0 -76 -5.5 -139t-18.5 -130.5t-39 -118t-64.5 -92t-97 -63.5t-133.5 -22q-76 0 -194 22.5t-210 59.5v-619h-147zM270 188q202 -53 404 -53q52 0 88 18t64 63.5 t41.5 127.5t13.5 205q0 198 -53 298.5t-154 100.5q-76 0 -154.5 -15.5t-129 -33t-120.5 -45.5v-666z" />
+<glyph unicode="q" horiz-adv-x="1136" d="M102 549q0 264 94.5 407.5t282.5 143.5q96 0 204 -9.5t207 -22.5t124 -15v-1606h-152v612q-92 -37 -200 -58t-183 -21q-92 0 -159.5 29t-108.5 77.5t-66 123t-34 155t-9 184.5zM254 471q0 -21 2 -60t6 -62t11.5 -56.5t18.5 -53t28.5 -43t39.5 -36t52 -21t67 -8.5 q114 0 185 9.5t198 41.5v766h-383q-45 0 -81 -16t-59.5 -40t-40 -61.5t-25 -70t-13 -77t-5.5 -71.5t-1 -63v-17v-61z" />
+<glyph unicode="r" horiz-adv-x="872" d="M123 0v1087h106l45 -137q8 5 51.5 30t56 32t50 26.5t59 26t56 17.5t66.5 14.5t67 3.5q116 0 151 -17v-149q-50 12 -151 12q-78 0 -148.5 -16.5t-113 -35t-144.5 -67.5v-827h-151z" />
+<glyph unicode="s" horiz-adv-x="1036" d="M82 733v94q0 133 65.5 202t217.5 69q72 0 255 -12t279 -21v-117h-534q-47 0 -75.5 -8t-40 -27.5t-14 -36t-2.5 -49.5v-94q0 -41 9 -66t29.5 -35.5t39.5 -13t54 -2.5h323q129 0 197.5 -72t68.5 -192v-100q0 -65 -15.5 -113t-40 -76t-61 -45t-71.5 -22.5t-78 -5.5 q-66 0 -273 15.5t-288 23.5v112h561q1 2 12 0t28.5 4t34 15t28.5 33.5t12 58.5v100q0 57 -25.5 85t-89.5 28h-323q-151 0 -217 57.5t-66 210.5z" />
+<glyph unicode="t" horiz-adv-x="774" d="M41 938v115l203 37l37 303h114v-303h318v-152h-318v-549q0 -124 29 -173t88 -62q168 -43 182 -43v-109h-180q-270 0 -270 387v549h-203z" />
+<glyph unicode="u" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -97 51 -147t133 -50q60 0 106 6t100.5 25.5t85.5 33.5t110 52v837h151v-1087h-106l-45 127q-5 -3 -40 -23.5t-43 -24.5t-39 -21t-43.5 -21.5t-41 -17t-46.5 -16.5t-44.5 -10.5t-52 -8.5t-52.5 -2q-155 0 -245.5 102.5t-90.5 245.5z" />
+<glyph unicode="v" horiz-adv-x="1097" d="M41 1087h166l340 -864l344 864h166l-436 -1087h-152z" />
+<glyph unicode="w" horiz-adv-x="1640" d="M41 1087h166l321 -864l283 864h164l-111 -348l238 -516l332 864h165l-415 -1087h-152l-241 532l-179 -532h-163z" />
+<glyph unicode="x" horiz-adv-x="1073" d="M49 0l393 545l-393 542h189l294 -417l304 417h188l-397 -548l381 -539h-172l-299 414l-299 -414h-189z" />
+<glyph unicode="y" horiz-adv-x="1134" d="M43 1087h166l264 -849q27 -85 99 -85h8q26 1 28 5l312 929h170l-480 -1431l-153 -209h-95l193 553q-177 0 -246 225z" />
+<glyph unicode="z" horiz-adv-x="933" d="M61 936v151h811v-151l-581 -782h581v-152h-780v152l592 782h-623z" />
+<glyph unicode="{" horiz-adv-x="655" d="M41 614v138q4 0 27 2t31 3t29.5 4.5t31 8t24.5 12.5t22 18t13 25.5t6 34.5v483q0 76 23 143t69 121t122.5 85.5t174.5 31.5v-151q-52 0 -92 -10t-74 -34.5t-52.5 -71.5t-18.5 -114v-483q0 -71 -48.5 -116.5t-125.5 -59.5q74 -11 123 -58.5t49 -111.5v-592 q0 -99 65.5 -153t173.5 -48v-151q-88 0 -157.5 21.5t-112.5 56t-71 81.5t-39 94.5t-11 98.5v584q0 59 -55.5 86t-126.5 22z" />
+<glyph unicode="|" horiz-adv-x="501" d="M176 -147v1724h152v-1724h-152z" />
+<glyph unicode="}" horiz-adv-x="655" d="M41 -279q108 -6 174 48t66 153v592q0 64 49 111.5t123 58.5q-77 14 -125.5 59.5t-48.5 116.5v483q0 67 -18.5 114t-53 71.5t-74.5 34.5t-92 10v151q98 0 174.5 -31.5t122.5 -85.5t69 -121t23 -143v-483q0 -19 6 -34.5t13 -25.5t22 -18t24.5 -12.5t31 -8t29.5 -4.5t31 -3 t27 -2v-138q-71 5 -126.5 -22t-55.5 -86v-584q0 -51 -11 -98.5t-39 -94.5t-71 -81.5t-112.5 -56t-157.5 -21.5v151z" />
+<glyph unicode="~" horiz-adv-x="897" d="M102 1171q17 14 45 39.5t45 39.5t41 30.5t51 23.5t58 7q46 0 111.5 -36t105.5 -36q23 0 44.5 4.5t43 15.5t35 18.5t37 23t31.5 20.5l45 -86q-9 -9 -34 -34.5t-42.5 -41t-44 -34.5t-55.5 -28.5t-60 -9.5q-47 0 -116 36t-107 36q-36 0 -65 -11t-65 -31t-61 -30z" />
+<glyph unicode="&#xa1;" horiz-adv-x="550" d="M170 788v109q0 21 13.5 33t35.5 14h100q20 -2 35 -17t15 -36v-100q-4 -56 -47 -56h-103q-24 0 -36.5 14.5t-12.5 38.5zM180 -553l13 1088h153l16 -1088h-182z" />
+<glyph unicode="&#xa2;" horiz-adv-x="1003" d="M82 545q0 144 18.5 246.5t50 164t83 95.5t107 44t132.5 7v196h123v-206q121 -14 311 -48v-110q-285 16 -467 16q-43 0 -69.5 -5.5t-56 -28.5t-45 -66.5t-26 -121.5t-10.5 -191q0 -156 22 -243.5t65.5 -122t119.5 -34.5q84 0 204.5 5.5t199.5 11.5l78 6v-115 q-148 -43 -326 -53v-189h-123v183q-77 -1 -131 9t-106.5 43.5t-84 94t-50.5 164t-19 248.5z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1220" d="M102 0v121l148 31v524h-148v92l148 35v231q0 92 12.5 163.5t32.5 120.5t55 83t69.5 53t88 29.5t98.5 13t111 2.5q52 0 152.5 -8.5t174.5 -16.5l74 -8v-116h-397q-75 0 -112 -2t-81 -11.5t-62 -28.5t-36.5 -55t-23.5 -88t-5 -131v-231l555 -35v-92h-555v-524h715v-152 h-1014z" />
+<glyph unicode="&#xa4;" horiz-adv-x="940" d="M104 920l82 73l84 -86q84 62 189 62q113 0 203 -70l98 96l71 -82l-96 -96q49 -77 49 -172q0 -109 -57 -194l109 -109l-86 -76l-101 101q-85 -66 -190 -66q-99 0 -180 59l-97 -96l-76 86l93 90q-64 89 -64 205q0 101 58 184zM250 641q0 -90 60.5 -155.5t148.5 -65.5 t149.5 65.5t61.5 155.5q0 88 -61.5 148.5t-149.5 60.5q-86 0 -147.5 -61.5t-61.5 -147.5z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1228" d="M41 1499h166l387 -692l422 692h172l-516 -842h370v-120h-372v-103h372v-121h-372v-313h-152v313h-350v121h350v103h-350v120h348z" />
+<glyph unicode="&#xa6;" horiz-adv-x="503" d="M176 -147v671h152v-671h-152zM176 879v698h152v-698h-152z" />
+<glyph unicode="&#xa7;" horiz-adv-x="1130" d="M113 1208v144q0 72 22.5 124t62 79t84 39t97.5 12q66 0 273 -15.5t288 -23.5v-113h-561q-57 0 -85.5 -22t-29.5 -80v-144q0 -96 115 -96h366q84 0 140 -18.5t84.5 -55.5t39 -80.5t9.5 -105.5v-127q0 -169 -86 -182q28 -4 46 -20.5t25.5 -43.5t10 -50t2.5 -54v-150 q0 -64 -17.5 -110.5t-43.5 -71t-67 -38.5t-74.5 -17.5t-80.5 -3.5q-66 0 -262.5 15t-282.5 24v112h545q31 0 50.5 2.5t39.5 11.5t30 27.5t11 48.5v150q0 61 -26 78.5t-93 17.5h-366q-66 0 -111 10.5t-81.5 37t-54 77t-17.5 127.5v127q0 82 19.5 128t70.5 62 q-49 14 -70.5 60.5t-21.5 107.5zM264 723q0 -64 25.5 -82t89.5 -18h366q35 0 58.5 6t35.5 13t18 23.5t6.5 26.5t0.5 33v127q0 32 -2.5 48.5t-13.5 33t-36 23t-67 6.5h-366q-69 0 -92 -21t-23 -94v-125z" />
+<glyph unicode="&#xa8;" horiz-adv-x="933" d="M102 1192q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74zM625 1192q0 43 30.5 72.5t73.5 29.5t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -73.5 31t-30.5 74z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1660" d="M113 754q0 77 5 147t18.5 146.5t35.5 140.5t58 123t83.5 99.5t115 64.5t149.5 24h552q65 0 120 -18t94.5 -46.5t72 -73t53 -89t36 -103.5t23.5 -108t12.5 -111t5.5 -103t1 -93q0 -123 -13.5 -230.5t-45 -205t-78.5 -167t-119 -110.5t-162 -41h-552q-78 0 -144 27.5 t-113 73.5t-84 109.5t-60 131.5t-37.5 143t-20.5 140.5t-6 128.5zM244 754q0 -114 20 -221.5t59 -198.5t105 -146.5t150 -56.5h552q126 2 206.5 162t80.5 461q0 62 -1.5 112t-8.5 116.5t-18.5 117t-33 103.5t-51 87t-74 56t-100.5 22h-552q-58 0 -105 -16t-91 -58 t-73.5 -109.5t-47 -176.5t-17.5 -254zM473 748q0 234 80 340t215 106q83 0 365 -49v-107q-179 25 -365 25q-164 0 -164 -322q0 -56 4 -99t14.5 -84t28.5 -67.5t47.5 -42.5t69.5 -16q139 0 377 33v-107q-202 -57 -377 -57q-65 0 -115 19.5t-92.5 67t-65 138.5t-22.5 222z" />
+<glyph unicode="&#xaa;" horiz-adv-x="745" d="M61 549v119h623v-119h-623zM61 948v94q0 84 55 134.5t150 50.5q287 -2 287 0q2 63 0 65q0 103 -125 103q-64 0 -179.5 -6.5t-162.5 -8.5v86q36 5 103 18t126.5 20.5t128.5 8.5q103 2 169.5 -50.5t66.5 -159.5v-529h-82l-43 100q-1 0 -19.5 -11t-49.5 -27t-67 -32 t-77.5 -27t-75.5 -11q-85 0 -145 48.5t-60 133.5zM188 975q0 -82 91 -82q55 0 123.5 16.5t109.5 32.5l41 16v177l-274 -21q-47 -4 -69 -27.5t-22 -56.5v-55z" />
+<glyph unicode="&#xab;" horiz-adv-x="1124" d="M102 725l422 416l107 -107l-318 -309l328 -319l-106 -107zM483 725l422 416l107 -107l-318 -309l328 -319l-107 -107z" />
+<glyph unicode="&#xac;" horiz-adv-x="1079" d="M102 524v152h875v-350h-152v198h-723z" />
+<glyph unicode="&#xad;" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" />
+<glyph unicode="&#xae;" horiz-adv-x="1660" d="M113 754q0 77 5 147t18.5 146.5t35.5 140.5t58 123t83.5 99.5t115 64.5t149.5 24h552q65 0 120 -18t94.5 -46.5t72 -73t53 -89t36 -103.5t23.5 -108t12.5 -111t5.5 -103t1 -93q0 -123 -13.5 -230.5t-45 -205t-78.5 -167t-119 -110.5t-162 -41h-552q-78 0 -144 27.5 t-113 73.5t-84 109.5t-60 131.5t-37.5 143t-20.5 140.5t-6 128.5zM244 754q0 -114 20 -221.5t59 -198.5t105 -146.5t150 -56.5h552q126 2 206.5 162t80.5 461q0 62 -1.5 112t-8.5 116.5t-18.5 117t-33 103.5t-51 87t-74 56t-100.5 22h-552q-58 0 -105 -16t-91 -58 t-73.5 -109.5t-47 -176.5t-17.5 -254zM535 313v875h362q274 0 274 -262q0 -66 -13.5 -115t-32 -75t-47 -43.5t-49 -23.5t-47.5 -11q-5 -1 -7 -1l186 -344h-147l-187 349l-161 24v-373h-131zM666 776h243q80 0 105.5 29t25.5 119q0 46 -12 75t-35 40.5t-40 14.5t-44 3h-243 v-281z" />
+<glyph unicode="&#xaf;" horiz-adv-x="802" d="M102 1087v130h598v-130h-598z" />
+<glyph unicode="&#xb0;" horiz-adv-x="620" d="M102 1294q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5q-87 0 -148 61t-61 148zM199 1294q0 -46 33 -78t79 -32t78.5 32t32.5 78t-32.5 79.5t-78.5 33.5t-79 -33.5t-33 -79.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1079" d="M115 178v152h852v-152h-852zM115 793v151h348v350h151v-350h353v-151h-353v-351h-151v351h-348z" />
+<glyph unicode="&#xb2;" horiz-adv-x="792" d="M63.5 1716.5q-0.5 24.5 0.5 48.5t2 23q20 2 74 9t76.5 9.5t64.5 6t79.5 5t79.5 1.5q267 0 267 -279q0 -70 -33 -147t-75 -136t-105 -124t-99 -96.5t-81 -69.5q-8 -6 -11 -9h402v-127h-633v119q17 14 83 64.5t109.5 86t107.5 95.5t103 109.5t68.5 111.5t29.5 117 q0 84 -34 121t-121 37h-352q-2 0 -2.5 24.5z" />
+<glyph unicode="&#xb3;" horiz-adv-x="831" d="M61 1683v89q21 8 45.5 13.5t43.5 9.5t49 6.5t46.5 4t52.5 2t50 0.5h57h56q125 0 186.5 -68.5t61.5 -170.5v-72q0 -68 -29 -116t-72 -64q101 -64 101 -193v-57q0 -118 -57.5 -181t-200.5 -63h-48h-49t-42.5 0.5t-44.5 1.5t-38.5 2.5t-42.5 4.5t-37.5 7t-41 9t-37.5 12 l2 88l362 2q82 0 115 28.5t33 96.5v47q0 72 -39.5 106t-100.5 36l-290 10v96l290 14q69 3 105.5 37t36.5 95v45q0 122 -142 122h-381z" />
+<glyph unicode="&#xb4;" horiz-adv-x="495" d="M41 1087l219 273h195l-273 -273h-141z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1216" d="M184 330v757h152v-757q0 -97 51 -147t133 -50q60 0 106 6t100.5 25.5t85.5 33.5t110 52v837h151v-1087h-106l-45 127q-5 -3 -40 -23.5t-43 -24.5t-39 -21t-43.5 -21.5t-41 -17t-46.5 -16.5t-44.5 -10.5t-52 -8.5t-52.5 -2q-108 0 -184 51v-586h-152v883z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1189" d="M82 1022v190q0 93 47.5 160t118.5 97t153 30h748v-156h-141v-1343h-152v1348h-192v-1901h-152v1315q-1 0 -19 -10.5t-42 -18t-50 -6.5q-152 0 -235.5 84t-83.5 211zM233 1026q0 -45 17.5 -76t46 -45.5t53.5 -20t51 -5.5h111v469h-111q-47 0 -82 -13.5t-52.5 -35.5 t-25.5 -44.5t-8 -46.5v-182z" />
+<glyph unicode="&#xb7;" horiz-adv-x="557" d="M174 725v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-22 0 -35.5 12.5t-13.5 34.5z" />
+<glyph unicode="&#xb8;" horiz-adv-x="516" d="M102 -279l109 31q39 17 52 60t13 112h138q0 -159 -43 -218.5t-164 -59.5h-105v75z" />
+<glyph unicode="&#xb9;" horiz-adv-x="555" d="M33 1593v101l262 112h127v-975h-127v834z" />
+<glyph unicode="&#xba;" horiz-adv-x="798" d="M61 1126q0 219 72.5 301t267.5 82q194 0 265 -82t71 -301q0 -200 -72 -281t-264 -81t-266 81t-74 281zM84 555v119h629v-119h-629zM188 1126q0 -56 6 -96.5t21 -66t30 -40.5t44 -22t51 -8.5t61 -1.5q37 0 55 1t45 5t39.5 13t28 25.5t22.5 42t12.5 62t6.5 86.5 q1 47 -1.5 83.5t-10.5 63t-16 45.5t-24 31t-29 18.5t-37.5 10t-41.5 4t-49 0.5q-67 0 -96 -4.5t-62 -27.5t-44 -76.5t-11 -147.5z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1124" d="M102 406l328 319l-317 309l106 107l422 -416l-432 -426zM483 406l328 319l-317 309l106 107l422 -416l-432 -426z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1849" d="M33 1286v100l262 113h127v-975h-127v834zM451 0l712 1499h133l-712 -1499h-133zM1016 293l428 678h145l-370 -594h340v248l57 98h70v-346h120v-107l-120 -26v-246h-127v246h-498z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1994" d="M33 1286v100l262 113h127v-975h-127v834zM440 0l713 1499h133l-713 -1499h-133zM1267.5 884.5q-0.5 24.5 0.5 48.5t2 23q19 2 74 9t77 9t64.5 6t80 5.5t79.5 1.5q266 0 266 -278q0 -70 -33 -147t-75 -136t-105 -124t-99 -96.5t-81 -69.5q-2 -2 -3.5 -3t-3.5 -3t-4 -3h402 v-127h-633v119q19 16 70 54.5t90.5 70t93.5 78t94.5 90t77.5 92.5t56.5 99.5t19.5 98.5q0 84 -34.5 121t-121.5 37h-352q-2 0 -2.5 24.5z" />
+<glyph unicode="&#xbe;" horiz-adv-x="2086" d="M61 1376v88q19 7 38 12t42.5 9t39.5 7t45 4.5t41.5 2.5t47.5 1.5t45 0.5h51.5h49.5q125 0 186.5 -68.5t61.5 -170.5v-72q0 -68 -29 -116t-72 -64q101 -64 101 -193v-57q0 -118 -57.5 -181t-200.5 -63h-48h-49t-42.5 0.5t-44.5 1.5t-38.5 2.5t-42.5 4.5t-37.5 7t-41 9 t-37.5 12l2 88l362 2q82 0 115 28.5t33 96.5v47q0 72 -39.5 105.5t-100.5 35.5l-290 11v96l290 14q69 3 105.5 36.5t36.5 94.5v45q0 123 -142 123h-381zM653 0l713 1499h133l-713 -1499h-133zM1190 295l426 676h137l-371 -600h359v256l49 98h70v-354h120v-99l-120 -26v-246 h-119v246h-506z" />
+<glyph unicode="&#xbf;" horiz-adv-x="1112" d="M82 45q-2 117 64 196.5t178.5 109t250.5 7.5l1 22q0 22 0.5 50.5t0.5 58t-0.5 51.5t-1.5 25h158l2 -332q-195 3 -293 0q-73 -3 -124.5 -62t-57.5 -140q-2 -164 -2 -205t14 -79.5t42 -72.5t79.5 -53.5t118.5 -17.5l559 2q-3 0 -3 -29.5t0.5 -55t-1.5 -28.5q-27 -3 -84 -11 t-82.5 -11t-73 -8.5t-79 -7.5t-76.5 -4t-89.5 -1.5t-93.5 2.5q-407 -2 -407 385v209zM553 807v104q0 21 15 36.5t34 17.5h100q23 -2 36.5 -14t13.5 -33v-111q-3 -48 -43 -51h-115q-38 11 -41 51z" />
+<glyph unicode="&#xc0;" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM376 1905h194l220 -273h-142zM469 569h489l-241 699z" />
+<glyph unicode="&#xc1;" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM469 569h489l-241 699zM648 1632l219 273h195l-272 -273h-142z" />
+<glyph unicode="&#xc2;" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM420 1632l239 266h146l213 -266h-146l-145 146l-160 -146h-147zM469 569h489l-241 699z" />
+<glyph unicode="&#xc3;" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM373 1716q55 45 83 66.5t73.5 43t84.5 21.5q56 -3 126 -36.5t94 -34.5q23 -1 60 12.5t55 23t71 37.5l45 -86q-12 -9 -41 -32.5t-47.5 -37t-45.5 -30t-52 -23.5t-50 -6q-49 3 -88.5 21t-70 34t-60.5 15 q-40 -1 -69.5 -12t-64 -30.5t-60.5 -29.5zM469 569h489l-241 699z" />
+<glyph unicode="&#xc4;" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM354 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74zM469 569h489l-241 699zM877 1737q0 43 30.5 72.5t73.5 29.5t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31 q-43 0 -73.5 31t-30.5 74z" />
+<glyph unicode="&#xc5;" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM469 569h489l-241 699zM511 1704q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5q-87 0 -148 61t-61 148zM607 1704q0 -45 33.5 -77.5t79.5 -32.5t78 32t32 78 t-32.5 79.5t-77.5 33.5q-46 0 -79.5 -33.5t-33.5 -79.5z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1886" d="M61 0l611 1237q39 78 81.5 130.5t79.5 79t85.5 39t84 14t89.5 0.5q11 -1 16.5 -1h14.5h16l655 -33v-120h-655q-35 0 -56.5 -8t-30.5 -27.5t-11.5 -32t-4.5 -41.5v-424l676 -20v-121l-676 -21v-403q0 -20 3.5 -35.5t7.5 -25.5t14 -17t16 -11t20.5 -5.5t20 -2t23.5 0 t22 0.5l629 -2v-125l-629 -35q-44 -3 -81 1t-75 20t-63.5 44t-42 77t-16.5 116v217h-430l-228 -465h-166zM530 616h355v719z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1183" d="M113 754q0 107 6 193.5t21.5 167t40.5 141t63.5 111t90 82.5t121 49.5t156.5 17.5q81 0 238 -16t262 -36v-121l-18 1q-18 1 -49 3t-71 4.5t-87 4.5t-93.5 4t-95 3t-86.5 1q-100 0 -163 -25.5t-106.5 -95t-61 -187.5t-17.5 -306q0 -611 348 -611q96 0 221 3.5t202 7.5 l77 4v-121q-100 -19 -255.5 -32t-244.5 -13q-499 0 -499 766zM446 -276l109 30q39 17 52.5 60t13.5 112h137q0 -159 -43 -218.5t-164 -59.5h-105v76z" />
+<glyph unicode="&#xc8;" horiz-adv-x="1161" d="M164 252v981q0 73 20.5 127t57 84t82 43.5t98.5 11.5l647 -33v-118h-647q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l672 -20v-121l-672 -20v-410q0 -26 5 -45.5t16 -31t20 -18t27.5 -9t28 -3t30.5 -0.5h627v-116l-627 -35q-44 -3 -81 1t-75 20t-63.5 44t-42 77 t-16.5 116zM360 1894h195l219 -272h-141z" />
+<glyph unicode="&#xc9;" horiz-adv-x="1161" d="M164 252v981q0 73 20.5 127t57 84t82 43.5t98.5 11.5l647 -33v-118h-647q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l672 -20v-121l-672 -20v-410q0 -26 5 -45.5t16 -31t20 -18t27.5 -9t28 -3t30.5 -0.5h627v-116l-627 -35q-44 -3 -81 1t-75 20t-63.5 44t-42 77 t-16.5 116zM588 1622l219 272h194l-272 -272h-141z" />
+<glyph unicode="&#xca;" horiz-adv-x="1161" d="M164 252v981q0 73 20.5 127t57 84t82 43.5t98.5 11.5l647 -33v-118h-647q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l672 -20v-121l-672 -20v-410q0 -26 5 -45.5t16 -31t20 -18t27.5 -9t28 -3t30.5 -0.5h627v-116l-627 -35q-44 -3 -81 1t-75 20t-63.5 44t-42 77 t-16.5 116zM348 1632l240 266h145l213 -266h-145l-146 146l-159 -146h-148z" />
+<glyph unicode="&#xcb;" horiz-adv-x="1161" d="M164 252v981q0 73 20.5 127t57 84t82 43.5t98.5 11.5l647 -33v-118h-647q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l672 -20v-121l-672 -20v-410q0 -26 5 -45.5t16 -31t20 -18t27.5 -9t28 -3t30.5 -0.5h627v-116l-627 -35q-44 -3 -81 1t-75 20t-63.5 44t-42 77 t-16.5 116zM285 1726q0 43 30.5 73t73.5 30t73 -30t30 -73t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5zM807 1726q0 43 30.5 73t73.5 30t73 -30t30 -73t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5z" />
+<glyph unicode="&#xcc;" horiz-adv-x="438" d="M-103 1905h194l219 -273h-141zM164 0v1499h151v-1499h-151z" />
+<glyph unicode="&#xcd;" horiz-adv-x="438" d="M164 0v1499h151v-1499h-151zM169 1632l219 273h195l-273 -273h-141z" />
+<glyph unicode="&#xce;" horiz-adv-x="438" d="M-59 1632l239 266h146l213 -266h-146l-145 146l-160 -146h-147zM164 0v1499h151v-1499h-151z" />
+<glyph unicode="&#xcf;" horiz-adv-x="438" d="M-125 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74zM164 0v1499h151v-1499h-151zM397 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1345" d="M31 709v110h133v678q0 2 559 2q96 0 174.5 -26.5t132.5 -69.5t95 -105.5t65 -127.5t38.5 -143.5t19.5 -144.5t5 -139q0 -88 -12 -173.5t-37 -170t-68 -155.5t-99.5 -126.5t-137 -86.5t-176.5 -31h-559v709h-133zM315 158h408q98 0 171.5 46.5t116.5 129.5t64 186t21 225 q0 308 -98.5 450t-274.5 142l-408 -2v-516h285v-110h-285v-551z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1392" d="M164 0v1499h155l799 -1216v1216h152v-1499h-152l-801 1217v-1217h-153zM371 1716q55 45 83 66.5t73.5 43t84.5 21.5q56 -3 125.5 -36.5t93.5 -34.5q23 -1 59.5 12.5t56.5 23.5t71 37l45 -86q-12 -9 -41 -32.5t-47.5 -37t-45.5 -30t-52 -23.5t-50 -6q-49 3 -88.5 21 t-70 34t-60.5 15q-40 -1 -69.5 -12t-64 -30.5t-60.5 -29.5z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1384" d="M133 739q0 116 9 211.5t24.5 169t41.5 131t54.5 98.5t69 70t79.5 46.5t92 27.5t101 13t111 3q65 0 113.5 -3t101.5 -13t92 -27.5t79 -46.5t67.5 -70t52.5 -98.5t39.5 -131t23 -169t8.5 -211.5q0 -110 -8 -200t-22 -161t-38 -126.5t-51 -96t-65.5 -69.5t-78.5 -47.5 t-93 -28.5t-104 -14t-117 -4q-67 0 -117.5 3t-104.5 12.5t-93 26.5t-79 45t-67 68t-51.5 95.5t-39 127t-22.5 164t-8 205.5zM285 739q0 -133 8.5 -227t31.5 -161.5t53 -107t82 -62.5t110 -30.5t145 -7.5q85 0 143 8.5t109 33t81.5 65.5t52.5 108t31 159.5t9 221.5 q0 91 -4 166t-14.5 133.5t-20.5 104t-31 79t-37.5 56.5t-48.5 38t-54.5 23.5t-64.5 12.5t-70.5 5t-80.5 1q-57 0 -87.5 -1t-76 -6.5t-69.5 -17t-57.5 -32.5t-50.5 -52t-37.5 -77.5t-29.5 -107.5t-15.5 -142.5t-6.5 -182.5zM372 1905h194l219 -273h-141z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1384" d="M133 739q0 116 9 211.5t24.5 169t41.5 131t54.5 98.5t69 70t79.5 46.5t92 27.5t101 13t111 3q65 0 113.5 -3t101.5 -13t92 -27.5t79 -46.5t67.5 -70t52.5 -98.5t39.5 -131t23 -169t8.5 -211.5q0 -110 -8 -200t-22 -161t-38 -126.5t-51 -96t-65.5 -69.5t-78.5 -47.5 t-93 -28.5t-104 -14t-117 -4q-67 0 -117.5 3t-104.5 12.5t-93 26.5t-79 45t-67 68t-51.5 95.5t-39 127t-22.5 164t-8 205.5zM285 739q0 -133 8.5 -227t31.5 -161.5t53 -107t82 -62.5t110 -30.5t145 -7.5q85 0 143 8.5t109 33t81.5 65.5t52.5 108t31 159.5t9 221.5 q0 91 -4 166t-14.5 133.5t-20.5 104t-31 79t-37.5 56.5t-48.5 38t-54.5 23.5t-64.5 12.5t-70.5 5t-80.5 1q-57 0 -87.5 -1t-76 -6.5t-69.5 -17t-57.5 -32.5t-50.5 -52t-37.5 -77.5t-29.5 -107.5t-15.5 -142.5t-6.5 -182.5zM644 1632l219 273h195l-273 -273h-141z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1384" d="M133 739q0 116 9 211.5t24.5 169t41.5 131t54.5 98.5t69 70t79.5 46.5t92 27.5t101 13t111 3q65 0 113.5 -3t101.5 -13t92 -27.5t79 -46.5t67.5 -70t52.5 -98.5t39.5 -131t23 -169t8.5 -211.5q0 -110 -8 -200t-22 -161t-38 -126.5t-51 -96t-65.5 -69.5t-78.5 -47.5 t-93 -28.5t-104 -14t-117 -4q-67 0 -117.5 3t-104.5 12.5t-93 26.5t-79 45t-67 68t-51.5 95.5t-39 127t-22.5 164t-8 205.5zM285 739q0 -133 8.5 -227t31.5 -161.5t53 -107t82 -62.5t110 -30.5t145 -7.5q85 0 143 8.5t109 33t81.5 65.5t52.5 108t31 159.5t9 221.5 q0 91 -4 166t-14.5 133.5t-20.5 104t-31 79t-37.5 56.5t-48.5 38t-54.5 23.5t-64.5 12.5t-70.5 5t-80.5 1q-57 0 -87.5 -1t-76 -6.5t-69.5 -17t-57.5 -32.5t-50.5 -52t-37.5 -77.5t-29.5 -107.5t-15.5 -142.5t-6.5 -182.5zM416 1632l239 266h146l213 -266h-146l-145 146 l-160 -146h-147z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1384" d="M133 739q0 116 9 211.5t24.5 169t41.5 131t54.5 98.5t69 70t79.5 46.5t92 27.5t101 13t111 3q65 0 113.5 -3t101.5 -13t92 -27.5t79 -46.5t67.5 -70t52.5 -98.5t39.5 -131t23 -169t8.5 -211.5q0 -110 -8 -200t-22 -161t-38 -126.5t-51 -96t-65.5 -69.5t-78.5 -47.5 t-93 -28.5t-104 -14t-117 -4q-67 0 -117.5 3t-104.5 12.5t-93 26.5t-79 45t-67 68t-51.5 95.5t-39 127t-22.5 164t-8 205.5zM285 739q0 -133 8.5 -227t31.5 -161.5t53 -107t82 -62.5t110 -30.5t145 -7.5q85 0 143 8.5t109 33t81.5 65.5t52.5 108t31 159.5t9 221.5 q0 91 -4 166t-14.5 133.5t-20.5 104t-31 79t-37.5 56.5t-48.5 38t-54.5 23.5t-64.5 12.5t-70.5 5t-80.5 1q-57 0 -87.5 -1t-76 -6.5t-69.5 -17t-57.5 -32.5t-50.5 -52t-37.5 -77.5t-29.5 -107.5t-15.5 -142.5t-6.5 -182.5zM369 1716q55 45 83 66.5t73.5 43t84.5 21.5 q56 -3 125.5 -36.5t93.5 -34.5q23 -1 59.5 12.5t56.5 23.5t71 37l45 -86q-12 -9 -41 -32.5t-47.5 -37t-45.5 -30t-52 -23.5t-50 -6q-49 3 -88.5 21t-70 34t-60.5 15q-40 -1 -69.5 -12t-64 -30.5t-60.5 -29.5z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1384" d="M133 739q0 116 9 211.5t24.5 169t41.5 131t54.5 98.5t69 70t79.5 46.5t92 27.5t101 13t111 3q65 0 113.5 -3t101.5 -13t92 -27.5t79 -46.5t67.5 -70t52.5 -98.5t39.5 -131t23 -169t8.5 -211.5q0 -110 -8 -200t-22 -161t-38 -126.5t-51 -96t-65.5 -69.5t-78.5 -47.5 t-93 -28.5t-104 -14t-117 -4q-67 0 -117.5 3t-104.5 12.5t-93 26.5t-79 45t-67 68t-51.5 95.5t-39 127t-22.5 164t-8 205.5zM285 739q0 -133 8.5 -227t31.5 -161.5t53 -107t82 -62.5t110 -30.5t145 -7.5q85 0 143 8.5t109 33t81.5 65.5t52.5 108t31 159.5t9 221.5 q0 91 -4 166t-14.5 133.5t-20.5 104t-31 79t-37.5 56.5t-48.5 38t-54.5 23.5t-64.5 12.5t-70.5 5t-80.5 1q-57 0 -87.5 -1t-76 -6.5t-69.5 -17t-57.5 -32.5t-50.5 -52t-37.5 -77.5t-29.5 -107.5t-15.5 -142.5t-6.5 -182.5zM350 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5 t-30 -74t-72 -31q-43 0 -74 31t-31 74zM872 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74z" />
+<glyph unicode="&#xd7;" horiz-adv-x="937" d="M115 481l247 246l-247 248l106 108l248 -247l250 247l106 -106l-250 -250l248 -246l-106 -108l-248 248l-246 -246z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1384" d="M133 739q0 104 6.5 192t20.5 158t31.5 126t44.5 98.5t55 74t66 53t75 35t86 21t93 10t102 2.5q128 0 215 -15t153 -60l43 65h125l-90 -139q133 -172 133 -621q0 -110 -8 -200t-22.5 -161t-38 -126.5t-51 -96t-66.5 -69.5t-78.5 -47.5t-92.5 -28.5t-104.5 -14t-117.5 -4 q-133 0 -223.5 16t-157.5 62l-45 -70h-125l92 145q-121 165 -121 594zM285 739q0 -325 63 -448l651 1016q-33 24 -82 35.5t-87.5 13.5t-116.5 2q-57 0 -87 -1t-76 -6.5t-70 -17t-57 -32.5t-50 -52t-37 -77.5t-29 -107.5t-15.5 -142.5t-6.5 -182.5zM418 205q49 -35 119 -48.5 t176 -13.5q85 0 143 8.5t109 32.5t82 65.5t53.5 108.5t31.5 159.5t9 221.5q0 348 -70 482z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -85 6.5 -153t15 -119t28.5 -89.5t35 -64.5t47 -43t52 -26t62.5 -13.5t66.5 -5t75 -0.5h16q44 0 67.5 1t63 5.5t62 13.5t53.5 26.5t49 43t39 64.5t31.5 89.5t18 119t7.5 151.5v844h154v-844q0 -138 -18.5 -245t-44.5 -176.5t-74.5 -118t-87 -72.5 t-105 -36.5t-105.5 -14.5t-110 -2q-162 0 -226 11q-159 29 -235 158q-94 157 -94 496zM371 1905h194l219 -273h-141z" />
+<glyph unicode="&#xda;" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -85 6.5 -153t15 -119t28.5 -89.5t35 -64.5t47 -43t52 -26t62.5 -13.5t66.5 -5t75 -0.5h16q44 0 67.5 1t63 5.5t62 13.5t53.5 26.5t49 43t39 64.5t31.5 89.5t18 119t7.5 151.5v844h154v-844q0 -138 -18.5 -245t-44.5 -176.5t-74.5 -118t-87 -72.5 t-105 -36.5t-105.5 -14.5t-110 -2q-162 0 -226 11q-159 29 -235 158q-94 157 -94 496zM643 1632l219 273h195l-273 -273h-141z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -85 6.5 -153t15 -119t28.5 -89.5t35 -64.5t47 -43t52 -26t62.5 -13.5t66.5 -5t75 -0.5h16q44 0 67.5 1t63 5.5t62 13.5t53.5 26.5t49 43t39 64.5t31.5 89.5t18 119t7.5 151.5v844h154v-844q0 -138 -18.5 -245t-44.5 -176.5t-74.5 -118t-87 -72.5 t-105 -36.5t-105.5 -14.5t-110 -2q-162 0 -226 11q-159 29 -235 158q-94 157 -94 496zM415 1632l239 266h146l213 -266h-146l-145 146l-160 -146h-147z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -85 6.5 -153t15 -119t28.5 -89.5t35 -64.5t47 -43t52 -26t62.5 -13.5t66.5 -5t75 -0.5h16q44 0 67.5 1t63 5.5t62 13.5t53.5 26.5t49 43t39 64.5t31.5 89.5t18 119t7.5 151.5v844h154v-844q0 -138 -18.5 -245t-44.5 -176.5t-74.5 -118t-87 -72.5 t-105 -36.5t-105.5 -14.5t-110 -2q-162 0 -226 11q-159 29 -235 158q-94 157 -94 496zM349 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74zM871 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74z " />
+<glyph unicode="&#xdd;" horiz-adv-x="1290" d="M92 1499h166l387 -786l428 786h166l-518 -967v-532h-152v532zM595 1632l219 273h195l-273 -273h-141z" />
+<glyph unicode="&#xde;" horiz-adv-x="1140" d="M123 0v1493h151v-289h404q360 -4 360 -436q0 -87 -12.5 -157t-32 -117.5t-49.5 -83t-60 -55t-68.5 -31.5t-69.5 -15.5t-68 -3.5q-11 0 -55.5 -0.5t-61 0.5t-60.5 4.5t-97.5 12t-129.5 22.5v-344h-151zM274 457h404q44 -1 77.5 10.5t65 43.5t48 97.5t16.5 163.5 q-1 76 -17 131.5t-36.5 83t-51.5 43t-52.5 18.5t-49.5 3h-404v-594z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1167" d="M123 0v1159q0 185 123 308.5t334 123.5q109 0 195 -22t139 -59t87 -86.5t43 -103.5t3 -111t-28.5 -108.5t-56 -95.5t-75.5 -73q-19 -16 -53.5 -43t-48.5 -39t-35.5 -32t-29.5 -33.5t-15 -32.5t-7 -39q0 -27 23.5 -45.5t61.5 -29.5t83.5 -21.5t91 -28t83.5 -42.5t61.5 -71 t23.5 -108v-97q1 -64 -20.5 -115t-55 -82.5t-78 -52t-86 -28.5t-83.5 -8q-62 0 -130.5 7.5t-134.5 18.5t-89 13v122q34 0 159 -5t203 -5q64 0 112.5 37.5t51.5 97.5v97q0 32 -23.5 53t-61.5 32.5t-83.5 21.5t-91 26t-83.5 39.5t-61.5 67.5t-23.5 106q0 97 46 159t202 177 q102 76 102 204q0 56 -28.5 94.5t-77.5 57.5t-100 27t-111 8q-134 0 -220 -68t-86 -213v-1159h-151z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q455 -2 455 0q2 136 0 138q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61q137 2 225.5 -76.5t88.5 -238.5v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5q-117 0 -194.5 72t-77.5 198z M203 1503h194l219 -272h-141zM233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q455 -2 455 0q2 136 0 138q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61q137 2 225.5 -76.5t88.5 -238.5v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5q-117 0 -194.5 72t-77.5 198z M233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103zM465 1231l219 272h195l-273 -272h-141z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q455 -2 455 0q2 136 0 138q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61q137 2 225.5 -76.5t88.5 -238.5v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5q-117 0 -194.5 72t-77.5 198z M233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103zM240 1231l239 266h146l213 -266h-146l-145 145l-160 -145h-147z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q455 -2 455 0q2 136 0 138q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61q137 2 225.5 -76.5t88.5 -238.5v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5q-117 0 -194.5 72t-77.5 198z M182 1315q41 34 62.5 50.5t55.5 39t64 32t60 9.5q56 -3 125.5 -37t93.5 -35q8 0 17 1t19 4t19 5.5t21.5 8t20.5 9.5t22.5 11t21.5 11t23 12.5t22 11.5l45 -86q-8 -6 -50.5 -40t-62.5 -47.5t-56 -28t-66 -13.5q-49 3 -88.5 21t-70 34t-60.5 15q-40 -1 -70 -12t-64.5 -30.5 t-60.5 -29.5zM233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q455 -2 455 0q2 136 0 138q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61q137 2 225.5 -76.5t88.5 -238.5v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5q-117 0 -194.5 72t-77.5 198z M171 1335q0 43 30.5 73t73.5 30t73 -30t30 -73t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5zM233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103zM693 1335q0 43 30.5 73t73.5 30t73 -30t30 -73t-30 -73.5 t-73 -30.5t-73.5 30.5t-30.5 73.5z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1062" d="M82 258v125q0 124 73 198t199 74q455 -2 455 0q2 136 0 138q0 90 -43.5 129t-124.5 39q-169 0 -524 -25v111q204 58 530 61q137 2 225.5 -76.5t88.5 -238.5v-793h-113l-39 131l-30 -15q-30 -14 -79 -35t-106 -42.5t-122.5 -36t-117.5 -14.5q-117 0 -194.5 72t-77.5 198z M233 268q0 -129 121 -129q73 0 186.5 26.5t191.5 52.5l77 26v293l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-103zM330 1378q0 88 61.5 149.5t147.5 61.5t146 -61.5t60 -149.5t-60 -148.5t-146 -60.5q-87 0 -148 61t-61 148zM426 1378q0 -45 33.5 -77.5t79.5 -32.5t78 32 t32 78t-32.5 79.5t-77.5 33.5q-46 0 -79.5 -33.5t-33.5 -79.5z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1783" d="M82 270v82q0 124 73 198.5t199 74.5q455 -2 455 0q2 178 0 180q0 90 -43.5 129t-124.5 39q-158 0 -524 -25v111q172 57 530 61q177 3 260 -119q53 63 142.5 85t236.5 22q63 0 104.5 -2.5t89.5 -11t78 -24.5t60 -44.5t47 -69t27 -99t10 -134.5q0 -250 -281 -250h-458 q0 -130 19 -197.5t61.5 -94.5t125.5 -27h77h82.5t70 0.5t78 2t66 3.5t74 5.5t64.5 8.5v-115q-201 -57 -512 -57q-85 0 -145.5 19.5t-93.5 46.5t-76 77l-35 -15q-35 -15 -90 -36t-119 -42.5t-134 -36.5t-122 -15q-117 0 -194.5 72t-77.5 198zM233 281q0 -129 121 -129 q73 0 186.5 26t191.5 52l77 26v262l-455 -33q-62 -6 -91.5 -42.5t-29.5 -90.5v-71zM963 623h458q67 0 98 24.5t31 75.5q0 56 -3.5 92t-16 63.5t-28 41.5t-49 23t-69 11t-96.5 2q-63 0 -92 -1t-72.5 -7t-61.5 -18.5t-42.5 -36t-33.5 -59.5t-16 -88t-7 -123z" />
+<glyph unicode="&#xe7;" horiz-adv-x="1024" d="M102 545q0 139 18 240t47.5 161.5t77.5 96t98 47.5t118 12q160 0 467 -58v-110q-285 16 -467 16q-43 0 -69.5 -5.5t-56 -28.5t-45 -66.5t-26 -121.5t-10.5 -191q0 -156 22 -243.5t65.5 -122t119.5 -34.5q84 0 204 5.5t199 11.5l78 6v-115q-197 -56 -481 -59 q-66 0 -116 12t-97.5 47.5t-78 96t-49 162.5t-18.5 241zM358 -279l109 31q39 17 52 60t13 112h138q0 -159 -43 -218.5t-164 -59.5h-105v75z" />
+<glyph unicode="&#xe8;" horiz-adv-x="1075" d="M102 549q0 104 9 183t26 137.5t47 98.5t65 65.5t88.5 39t108 18.5t132.5 5q63 0 104.5 -2.5t89 -11t78 -24.5t60.5 -44.5t46.5 -69t26.5 -99t10 -134.5q0 -250 -280 -250h-459q0 -130 19 -198t62 -95t126 -27h55h57h51.5t54.5 0.5t49.5 1.5t53 2t47.5 2.5t50.5 3.5 t45.5 5t48 6v-115q-201 -57 -512 -57q-85 0 -144 17.5t-101.5 56t-67 105t-35.5 158t-11 222.5zM234 1493h195l219 -272h-141zM254 610h459q67 0 98 25t31 76q0 56 -3.5 92t-16 63.5t-28 41.5t-49 23t-69 11t-96.5 2q-62 0 -92 -1t-73 -7t-61.5 -19t-43 -36t-33.5 -59.5 t-16 -88.5t-7 -123z" />
+<glyph unicode="&#xe9;" horiz-adv-x="1075" d="M102 549q0 104 9 183t26 137.5t47 98.5t65 65.5t88.5 39t108 18.5t132.5 5q63 0 104.5 -2.5t89 -11t78 -24.5t60.5 -44.5t46.5 -69t26.5 -99t10 -134.5q0 -250 -280 -250h-459q0 -130 19 -198t62 -95t126 -27h55h57h51.5t54.5 0.5t49.5 1.5t53 2t47.5 2.5t50.5 3.5 t45.5 5t48 6v-115q-201 -57 -512 -57q-85 0 -144 17.5t-101.5 56t-67 105t-35.5 158t-11 222.5zM254 610h459q67 0 98 25t31 76q0 56 -3.5 92t-16 63.5t-28 41.5t-49 23t-69 11t-96.5 2q-62 0 -92 -1t-73 -7t-61.5 -19t-43 -36t-33.5 -59.5t-16 -88.5t-7 -123zM486 1221 l220 272h194l-272 -272h-142z" />
+<glyph unicode="&#xea;" horiz-adv-x="1075" d="M102 549q0 104 9 183t26 137.5t47 98.5t65 65.5t88.5 39t108 18.5t132.5 5q63 0 104.5 -2.5t89 -11t78 -24.5t60.5 -44.5t46.5 -69t26.5 -99t10 -134.5q0 -250 -280 -250h-459q0 -130 19 -198t62 -95t126 -27h55h57h51.5t54.5 0.5t49.5 1.5t53 2t47.5 2.5t50.5 3.5 t45.5 5t48 6v-115q-201 -57 -512 -57q-85 0 -144 17.5t-101.5 56t-67 105t-35.5 158t-11 222.5zM254 610h459q67 0 98 25t31 76q0 56 -3.5 92t-16 63.5t-28 41.5t-49 23t-69 11t-96.5 2q-62 0 -92 -1t-73 -7t-61.5 -19t-43 -36t-33.5 -59.5t-16 -88.5t-7 -123zM262 1221 l240 266h145l213 -266h-145l-146 145l-159 -145h-148z" />
+<glyph unicode="&#xeb;" horiz-adv-x="1075" d="M102 549q0 104 9 183t26 137.5t47 98.5t65 65.5t88.5 39t108 18.5t132.5 5q63 0 104.5 -2.5t89 -11t78 -24.5t60.5 -44.5t46.5 -69t26.5 -99t10 -134.5q0 -250 -280 -250h-459q0 -130 19 -198t62 -95t126 -27h55h57h51.5t54.5 0.5t49.5 1.5t53 2t47.5 2.5t50.5 3.5 t45.5 5t48 6v-115q-201 -57 -512 -57q-85 0 -144 17.5t-101.5 56t-67 105t-35.5 158t-11 222.5zM190 1325q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM254 610h459q67 0 98 25t31 76q0 56 -3.5 92t-16 63.5t-28 41.5t-49 23 t-69 11t-96.5 2q-62 0 -92 -1t-73 -7t-61.5 -19t-43 -36t-33.5 -59.5t-16 -88.5t-7 -123zM713 1325q0 43 30.5 72.5t73.5 29.5t73 -29.5t30 -72.5t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5z" />
+<glyph unicode="&#xec;" horiz-adv-x="397" d="M-144 1493h194l219 -272h-141zM123 0v1087h151v-1087h-151z" />
+<glyph unicode="&#xed;" horiz-adv-x="397" d="M123 0v1087h151v-1087h-151zM128 1221l219 272h195l-273 -272h-141z" />
+<glyph unicode="&#xee;" horiz-adv-x="397" d="M-100 1221l239 266h146l213 -266h-146l-145 145l-160 -145h-147zM123 0v1087h151v-1087h-151z" />
+<glyph unicode="&#xef;" horiz-adv-x="397" d="M-166 1325q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM123 0v1087h151v-1087h-151zM356 1325q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1101" d="M82 541q0 274 82.5 410t281.5 136h205q116 0 144 -30q-53 171 -152 270l-297 -119l-49 123l223 90q-107 57 -266 49v134q272 0 428 -121l242 96l51 -123l-187 -74q59 -72 103 -166t67.5 -181.5t38.5 -186t19 -168t4 -139.5q0 -149 -26.5 -256t-76.5 -168t-115.5 -89 t-150.5 -28h-205q-204 0 -284 127.5t-80 413.5zM233 541q0 -107 11.5 -181t28.5 -113.5t47.5 -60.5t56.5 -25.5t69 -4.5h205q64 0 107 25.5t67 77.5t33.5 119t9.5 163q0 95 -6.5 159.5t-20.5 112t-39.5 73.5t-61.5 38t-89 12h-205q-44 0 -74.5 -8.5t-58.5 -33.5t-44.5 -68.5 t-26 -114.5t-9.5 -170z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1114" d="M123 0v1087h106l45 -126q5 3 40 23.5t43 24.5t39 21t43.5 21.5t41 17t46.5 16.5t44.5 10.5t52 8.5t52.5 2q155 0 245.5 -102.5t90.5 -245.5v-758h-152v758q0 97 -51 146.5t-133 49.5q-79 0 -147 -15.5t-112 -34t-143 -66.5v-838h-151zM221 1313q41 34 62.5 50.5t55.5 39 t64 32t60 9.5q56 -3 125.5 -37t93.5 -35q8 0 17 1t19 4t19 5.5t21.5 8t20.5 9.5t22.5 11t21.5 11t23 12.5t22 11.5l45 -86q-8 -6 -50.5 -40t-62.5 -47.5t-56 -28t-66 -13.5q-49 3 -88.5 20.5t-70 33.5t-60.5 15q-40 -1 -70 -11.5t-64.5 -30t-60.5 -29.5z" />
+<glyph unicode="&#xf2;" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q140 0 230 -27.5t146.5 -96t79.5 -174.5t23 -272q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5 t38 -34.5t44 -22t52.5 -12.5t59 -6t67.5 -1.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 73 -4 129.5t-14 100t-22 74t-34 51.5t-44 33.5t-57.5 19t-68.5 8.5t-83 2q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130z M259 1493h195l219 -272h-142z" />
+<glyph unicode="&#xf3;" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q140 0 230 -27.5t146.5 -96t79.5 -174.5t23 -272q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5 t38 -34.5t44 -22t52.5 -12.5t59 -6t67.5 -1.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 73 -4 129.5t-14 100t-22 74t-34 51.5t-44 33.5t-57.5 19t-68.5 8.5t-83 2q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130z M511 1221l219 272h195l-273 -272h-141z" />
+<glyph unicode="&#xf4;" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q140 0 230 -27.5t146.5 -96t79.5 -174.5t23 -272q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5 t38 -34.5t44 -22t52.5 -12.5t59 -6t67.5 -1.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 73 -4 129.5t-14 100t-22 74t-34 51.5t-44 33.5t-57.5 19t-68.5 8.5t-83 2q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130z M293 1221l239 266h146l213 -266h-146l-145 145l-160 -145h-147z" />
+<glyph unicode="&#xf5;" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q140 0 230 -27.5t146.5 -96t79.5 -174.5t23 -272q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5 t38 -34.5t44 -22t52.5 -12.5t59 -6t67.5 -1.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 73 -4 129.5t-14 100t-22 74t-34 51.5t-44 33.5t-57.5 19t-68.5 8.5t-83 2q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130z M254 1305q41 34 62.5 50.5t55.5 39t64 32t60 9.5q56 -3 125.5 -37t93.5 -35q8 0 17 1t19 4t19 5.5t21.5 8t20.5 9.5t22.5 11t21.5 11t23 12.5t22 11.5l45 -86q-8 -6 -50.5 -40t-62.5 -47.5t-56 -28t-66 -13.5q-49 3 -88.5 20.5t-70 33.5t-60.5 15q-40 -1 -70 -11.5 t-64.5 -30t-60.5 -29.5z" />
+<glyph unicode="&#xf6;" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q140 0 230 -27.5t146.5 -96t79.5 -174.5t23 -272q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM219 1325q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5 t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5t38 -34.5t44 -22t52.5 -12.5t59 -6t67.5 -1.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 73 -4 129.5t-14 100t-22 74t-34 51.5t-44 33.5t-57.5 19t-68.5 8.5 t-83 2q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130zM741 1325q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1056" d="M102 647v152h852v-152h-852zM434 354v111q0 51 49 51h103q23 0 35 -14t12 -37v-111q0 -47 -47 -47h-103q-22 0 -35.5 12.5t-13.5 34.5zM434 967v110q0 51 49 51h103q23 0 35 -14t12 -37v-110q0 -47 -47 -47h-103q-22 0 -35.5 12.5t-13.5 34.5z" />
+<glyph unicode="&#xf8;" horiz-adv-x="1163" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q189 0 288 -51l31 40h135l-80 -108q56 -65 80.5 -174t24.5 -277q0 -155 -23 -255t-79.5 -164.5t-146.5 -91.5t-230 -27q-205 0 -312 65l-41 -55h-125l91 125q-93 118 -93 403zM254 528q0 -181 41 -268l485 662 q-59 24 -198 24q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130zM362 180q36 -24 88 -31.5t132 -7.5q62 0 101.5 4t81 17t65 38.5t43.5 68t28 106.5t8 153q0 237 -49 322z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -97 51 -147t133 -50q60 0 106 6t100.5 25.5t85.5 33.5t110 52v837h151v-1087h-106l-45 127q-5 -3 -40 -23.5t-43 -24.5t-39 -21t-43.5 -21.5t-41 -17t-46.5 -16.5t-44.5 -10.5t-52 -8.5t-52.5 -2q-155 0 -245.5 102.5t-90.5 245.5zM224 1493h195 l219 -272h-141z" />
+<glyph unicode="&#xfa;" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -97 51 -147t133 -50q60 0 106 6t100.5 25.5t85.5 33.5t110 52v837h151v-1087h-106l-45 127q-5 -3 -40 -23.5t-43 -24.5t-39 -21t-43.5 -21.5t-41 -17t-46.5 -16.5t-44.5 -10.5t-52 -8.5t-52.5 -2q-155 0 -245.5 102.5t-90.5 245.5zM476 1221 l219 272h195l-273 -272h-141z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -97 51 -147t133 -50q60 0 106 6t100.5 25.5t85.5 33.5t110 52v837h151v-1087h-106l-45 127q-5 -3 -40 -23.5t-43 -24.5t-39 -21t-43.5 -21.5t-41 -17t-46.5 -16.5t-44.5 -10.5t-52 -8.5t-52.5 -2q-155 0 -245.5 102.5t-90.5 245.5zM248 1221 l239 266h146l213 -266h-146l-145 145l-160 -145h-147z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -97 51 -147t133 -50q60 0 106 6t100.5 25.5t85.5 33.5t110 52v837h151v-1087h-106l-45 127q-5 -3 -40 -23.5t-43 -24.5t-39 -21t-43.5 -21.5t-41 -17t-46.5 -16.5t-44.5 -10.5t-52 -8.5t-52.5 -2q-155 0 -245.5 102.5t-90.5 245.5zM182 1325 q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM705 1325q0 43 30.5 72.5t73.5 29.5t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-73.5 30.5t-30.5 73.5z" />
+<glyph unicode="&#xfd;" horiz-adv-x="1134" d="M43 1087h166l264 -849q28 -90 107 -85q26 1 28 5l312 929h170l-480 -1431l-153 -209h-95l193 553q-177 0 -246 225zM496 1221l219 272h194l-272 -272h-141z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1134" d="M143 -553v2155h152v-637q54 40 180.5 90.5t218.5 50.5q81 0 144 -32t103 -84t65.5 -126t36 -151.5t10.5 -165.5q0 -76 -5 -138t-18 -130t-38.5 -119t-64 -93.5t-98 -64.5t-135.5 -22q-77 0 -192.5 21t-206.5 58v-612h-152zM295 182q48 -13 93 -22.5t91.5 -14.5t72.5 -7 t77.5 -4t64.5 -3q50 0 85.5 18.5t64 64t43 129.5t14.5 208q0 190 -55.5 296.5t-151.5 106.5q-159 -10 -399 -102v-670z" />
+<glyph unicode="&#xff;" horiz-adv-x="1134" d="M43 1087h166l264 -849q28 -90 107 -85q26 1 28 5l312 929h170l-480 -1431l-153 -209h-95l193 553q-177 0 -246 225zM202 1325q0 43 30.5 72.5t73.5 29.5t73 -29.5t30 -72.5t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5zM724 1325q0 43 30.5 72.5t73.5 29.5t73 -29.5 t30 -72.5t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="2160" d="M133 739q0 116 9 211.5t24.5 169t41 131t54 98.5t68.5 70t79.5 46.5t92 27.5t100.5 13t111 3q109 0 182.5 -9.5t145.5 -44t120 -97.5q28 76 91.5 111t146.5 30l649 -33v-118h-649q-38 0 -61 -9t-32.5 -29t-11.5 -35t-2 -42v-410l674 -20v-121l-674 -20v-410 q0 -26 5 -45.5t16 -31t20 -18t27.5 -9t28 -3t30.5 -0.5h629v-116l-629 -35q-213 -12 -262 141q-69 -83 -175 -113t-269 -30q-67 0 -117 3t-104.5 12.5t-93.5 26.5t-78.5 45t-66.5 68t-51.5 95.5t-38.5 127t-22 164t-8 205.5zM285 739q0 -133 8.5 -227t31 -161.5t52.5 -107 t82 -62.5t109.5 -30.5t144.5 -7.5q85 0 143 8.5t109 32.5t82 65.5t53.5 108.5t31.5 159.5t9 221.5q0 91 -4 166t-14.5 133.5t-20.5 104t-31.5 79t-38 56.5t-48.5 38t-54.5 23.5t-65 12.5t-71 5t-80.5 1q-57 0 -87 -1t-76 -6.5t-70 -17t-57 -32.5t-50 -52t-37 -77.5 t-29 -107.5t-15.5 -142.5t-6.5 -182.5z" />
+<glyph unicode="&#x153;" horiz-adv-x="1878" d="M102 528q0 135 16 230t50 162t92 105.5t135 55.5t187 17q151 0 246.5 -34.5t148.5 -111.5q51 85 144.5 114.5t258.5 29.5q63 0 104.5 -2.5t89.5 -11t78 -24.5t60 -44.5t47 -69t27 -99t10 -134.5q0 -250 -280 -250h-457q-6 -176 39 -248t166 -72h55h57h51.5t54.5 0.5 t49.5 1.5t53 2t47.5 2.5t50.5 3.5t45.5 5t48 6v-115q-201 -57 -512 -57q-110 0 -181 32t-110 103q-53 -71 -148 -103t-243 -32q-139 0 -230 28.5t-147.5 95t-79.5 165.5t-23 249zM254 528q0 -60 4.5 -108.5t12 -86t21.5 -66.5t29 -49.5t38 -34.5t44 -22t52.5 -12.5t59 -6 t67.5 -1.5q73 0 122.5 6.5t87 26.5t58.5 47t34 76.5t17 106.5t4 145q0 127 -14 202.5t-53.5 120t-97.5 59.5t-158 15q-48 0 -80 -2t-67.5 -8.5t-57.5 -18.5t-44.5 -33t-35.5 -52t-23.5 -74t-15 -100t-4.5 -130zM1059 610h457q67 0 98 25t31 76q0 56 -3.5 92t-16 63.5 t-28.5 41.5t-49.5 23t-69 11t-96.5 2q-66 0 -106.5 -3t-82.5 -14.5t-65 -33t-41.5 -58.5t-24.5 -92t-3 -133z" />
+<glyph unicode="&#x178;" horiz-adv-x="1290" d="M92 1499h166l387 -786l428 786h166l-518 -967v-532h-152v532zM301 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74zM823 1737q0 42 31 72t74 30t72.5 -29.5t29.5 -72.5t-30 -74t-72 -31q-43 0 -74 31t-31 74z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="802" d="M102 1087l240 267h145l213 -267h-145l-145 146l-160 -146h-148zM487 1354z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="897" d="M102 1171q42 35 63 51t55.5 39t64 32.5t59.5 9.5q56 -3 125.5 -37t93.5 -35q8 0 16.5 1t19.5 4t19 5.5t22 8.5t20.5 9t23 11t21.5 11t23 12.5t22 11.5l45 -86q-12 -9 -41 -32.5t-47.5 -37t-45.5 -30t-52 -23.5t-50 -6q-49 3 -88.5 20.5t-70 33.5t-60.5 15q-40 -1 -70 -12 t-64.5 -30.5t-60.5 -29.5z" />
+<glyph unicode="&#x2000;" horiz-adv-x="957" />
+<glyph unicode="&#x2001;" horiz-adv-x="1915" />
+<glyph unicode="&#x2002;" horiz-adv-x="957" />
+<glyph unicode="&#x2003;" horiz-adv-x="1915" />
+<glyph unicode="&#x2004;" horiz-adv-x="638" />
+<glyph unicode="&#x2005;" horiz-adv-x="478" />
+<glyph unicode="&#x2006;" horiz-adv-x="319" />
+<glyph unicode="&#x2007;" horiz-adv-x="319" />
+<glyph unicode="&#x2008;" horiz-adv-x="239" />
+<glyph unicode="&#x2009;" horiz-adv-x="383" />
+<glyph unicode="&#x200a;" horiz-adv-x="106" />
+<glyph unicode="&#x2010;" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" />
+<glyph unicode="&#x2011;" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" />
+<glyph unicode="&#x2012;" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" />
+<glyph unicode="&#x2013;" horiz-adv-x="1050" d="M41 512v154h969v-154h-969z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1507" d="M41 516v154h1425v-154h-1425z" />
+<glyph unicode="&#x2018;" horiz-adv-x="552" d="M164 1141v202q0 43 11.5 76.5t30.5 51.5t42 29.5t45.5 14.5t41.5 3.5t31 -0.5l11 -2v-72q-24 1 -39.5 -6t-21.5 -19.5t-7.5 -22t-1.5 -22.5v-57h25q25 0 41 -13.5t16 -41.5v-121q0 -62 -57 -62h-115q-53 0 -53 62z" />
+<glyph unicode="&#x2019;" horiz-adv-x="552" d="M164 1337v121q0 62 57 62h115q53 0 53 -62v-203q0 -60 -22 -99.5t-53.5 -54t-62.5 -20t-53 -3.5l-22 3v72q24 -1 39.5 6t21.5 20.5t7.5 23t1.5 22.5v55h-25q-25 0 -41 14.5t-16 42.5z" />
+<glyph unicode="&#x201a;" horiz-adv-x="552" d="M164 55v121q0 62 57 62h115q53 0 53 -62v-203q0 -60 -22 -100t-53.5 -54.5t-62.5 -20t-53 -2.5l-22 3v72q24 -1 39.5 6t21.5 20.5t7.5 23t1.5 22.5v55h-25q-25 0 -41 14.5t-16 42.5z" />
+<glyph unicode="&#x201c;" horiz-adv-x="856" d="M150 1141v202q0 60 22 99.5t53 53.5t62 20t53 3l22 -3v-72q-24 1 -39.5 -6t-21 -20t-7 -22t-1.5 -22v-55h24q25 0 41.5 -14.5t16.5 -42.5v-121q0 -62 -58 -62h-114q-53 0 -53 62zM481 1141v202q0 60 22 99.5t53.5 53.5t63.5 20t54 3l22 -3v-72q-24 1 -39.5 -6 t-21.5 -19.5t-8 -22t-2 -22.5v-55h26q25 0 40.5 -14.5t15.5 -42.5v-121q0 -62 -56 -62h-114q-56 0 -56 62z" />
+<glyph unicode="&#x201d;" horiz-adv-x="856" d="M150 1337v121q0 62 55 62h114q56 0 56 -62v-203q0 -43 -12 -76.5t-31 -51.5t-41.5 -30t-45.5 -15t-42 -3.5t-31 1.5l-12 1v72q24 -1 39.5 6t21 20.5t7 22.5t1.5 23v55h-24q-25 0 -40 14.5t-15 42.5zM481 1337v121q0 62 58 62h114q54 0 54 -62v-203q0 -60 -22 -99.5 t-53.5 -54t-62.5 -20t-53 -3.5l-22 3v72q24 -1 39.5 6t21 20.5t7 22.5t1.5 23v55h-24q-25 0 -41.5 14.5t-16.5 42.5z" />
+<glyph unicode="&#x201e;" horiz-adv-x="856" d="M150 55v121q0 62 55 62h114q56 0 56 -62v-203q0 -44 -12 -77t-31 -51.5t-41.5 -30t-45.5 -14.5t-42 -4t-31 1l-12 2v72q24 -1 39.5 6t21 20.5t7 22.5t1.5 23v55h-24q-25 0 -40 14.5t-15 42.5zM481 55v121q0 62 58 62h114q54 0 54 -62v-203q0 -60 -22 -100t-53.5 -54.5 t-62.5 -20t-53 -2.5l-22 3v72q24 -1 39.5 6t21 20.5t7 22.5t1.5 23v55h-24q-25 0 -41.5 14.5t-16.5 42.5z" />
+<glyph unicode="&#x2022;" horiz-adv-x="638" d="M174 698v164q0 33 17.5 52.5t50.5 19.5h151q72 0 72 -72v-164q0 -65 -72 -65h-151q-31 0 -49.5 17.5t-18.5 47.5z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1671" d="M174 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-22 0 -35.5 12.5t-13.5 34.5zM731 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-22 0 -35.5 12.5t-13.5 34.5zM1288 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109 q-22 0 -35.5 12.5t-13.5 34.5z" />
+<glyph unicode="&#x202f;" horiz-adv-x="383" />
+<glyph unicode="&#x2039;" horiz-adv-x="731" d="M102 725l422 416l107 -107l-318 -309l328 -319l-106 -107z" />
+<glyph unicode="&#x203a;" horiz-adv-x="731" d="M102 406l328 319l-317 309l106 107l422 -416l-432 -426z" />
+<glyph unicode="&#x205f;" horiz-adv-x="478" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1251" d="M41 522v96l180 15v207l-180 16v88l180 19v17q0 50 1 81t10 93.5t25.5 104.5t52 95t84.5 85t128 54.5t178 22.5q75 0 229.5 -20t272.5 -42v-121q-334 31 -502 31q-56 0 -101.5 -7t-78.5 -22.5t-57.5 -34t-40.5 -47.5t-26 -57t-15 -69.5t-6.5 -77t-1.5 -86.5l479 -15v-94 l-479 -14v-207l479 -15v-96q-31 -1 -81 -2t-155.5 -3.5t-175 -5t-67.5 -3.5q0 -369 327 -369q88 0 215.5 8.5t210.5 17.5l84 9v-115q-251 -71 -510 -71q-39 0 -76.5 4.5t-87 18t-91.5 36t-84.5 62.5t-72.5 93t-48.5 131.5t-18.5 174.5z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1417" d="M41 1368v131h530v-131h-198v-584h-131v584h-201zM651 784l56 715h129l190 -485l164 485h133l63 -715h-131l-34 414l-138 -414h-108l-162 416l-31 -416h-131z" />
+<glyph unicode="&#xe000;" horiz-adv-x="1085" d="M0 0v1085h1085v-1085h-1085z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="1990" d="M41 936v117l203 34v183q0 31 1 53t6 58t14.5 61.5t28 55t44.5 48t66.5 31t91.5 12.5q128 0 286 -49v-100l-252 2q-38 1 -64 -8.5t-39.5 -22t-20.5 -39.5t-8.5 -45.5t-2.5 -56.5l-4 -183h590v109q0 184 109.5 299t291.5 115q70 0 186 -22t199 -48v-100l-350 22 q-53 3 -100 -8t-90 -38.5t-68.5 -84t-25.5 -135.5v-109l735 -20v-1067h-154v936h-586v-936h-151v936h-586v-936h-151v936h-199z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="2205" d="M41 936v117l203 34v183q0 31 1 53t6 58t14.5 61.5t28 55t44.5 48t66.5 31t91.5 12.5q128 0 286 -49v-100l-252 2q-38 1 -64 -8.5t-39.5 -22t-20.5 -39.5t-8.5 -45.5t-2.5 -56.5l-4 -183h590v109q0 86 18 157.5t56 129.5t104.5 90.5t155.5 32.5h551v-1219 q0 -89 11.5 -135.5t34.5 -66.5t70 -33q169 -43 183 -43v-109h-180q-147 0 -209 86.5t-62 300.5v1075h-364q-53 0 -90 -11t-67 -39t-45 -81.5t-15 -134.5v-109h299v-151h-304v-936h-151v936h-586v-936h-151v936h-199z" />
+<hkern g1="P" 	g2="comma,period,ellipsis" 	k="328" />
+<hkern g1="P" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="184" />
+<hkern g1="P" 	g2="J" 	k="215" />
+<hkern g1="P" 	g2="X" 	k="82" />
+<hkern g1="P" 	g2="M" 	k="31" />
+<hkern g1="B" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="61" />
+<hkern g1="B" 	g2="X" 	k="61" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="S" 	k="72" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="v,w,y,yacute,ydieresis" 	k="164" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="s" 	k="20" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="f,t,uniFB03,uniFB04" 	k="61" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="quotesingle" 	k="164" />
+<hkern g1="quoteleft,quotedblleft" 	g2="J" 	k="184" />
+<hkern g1="quoteleft,quotedblleft" 	g2="M" 	k="61" />
+<hkern g1="quoteleft,quotedblleft" 	g2="g" 	k="102" />
+<hkern g1="quoteleft,quotedblleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="82" />
+<hkern g1="quoteleft,quotedblleft" 	g2="s" 	k="82" />
+<hkern g1="F" 	g2="J" 	k="164" />
+<hkern g1="F" 	g2="M" 	k="20" />
+<hkern g1="F" 	g2="g" 	k="92" />
+<hkern g1="F" 	g2="v,w,y,yacute,ydieresis" 	k="51" />
+<hkern g1="F" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="61" />
+<hkern g1="F" 	g2="s" 	k="61" />
+<hkern g1="F" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="61" />
+<hkern g1="F" 	g2="f,t,uniFB03,uniFB04" 	k="61" />
+<hkern g1="F" 	g2="p" 	k="41" />
+<hkern g1="F" 	g2="z" 	k="41" />
+<hkern g1="F" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="82" />
+<hkern g1="L" 	g2="v,w,y,yacute,ydieresis" 	k="123" />
+<hkern g1="L" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="82" />
+<hkern g1="L" 	g2="s" 	k="41" />
+<hkern g1="L" 	g2="f,t,uniFB03,uniFB04" 	k="102" />
+<hkern g1="L" 	g2="quotesingle" 	k="184" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="J" 	k="61" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="M" 	k="20" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="X" 	k="61" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="g" 	k="20" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="quotesingle" 	k="41" />
+<hkern g1="T" 	g2="J" 	k="123" />
+<hkern g1="T" 	g2="S" 	k="61" />
+<hkern g1="T" 	g2="g" 	k="246" />
+<hkern g1="T" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="T" 	g2="x" 	k="195" />
+<hkern g1="T" 	g2="v,w,y,yacute,ydieresis" 	k="205" />
+<hkern g1="T" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="328" />
+<hkern g1="T" 	g2="s" 	k="246" />
+<hkern g1="T" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="225" />
+<hkern g1="T" 	g2="f,t,uniFB03,uniFB04" 	k="115" />
+<hkern g1="T" 	g2="p" 	k="195" />
+<hkern g1="T" 	g2="z" 	k="184" />
+<hkern g1="T" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="246" />
+<hkern g1="V" 	g2="J" 	k="143" />
+<hkern g1="V" 	g2="S" 	k="31" />
+<hkern g1="V" 	g2="M" 	k="41" />
+<hkern g1="V" 	g2="g" 	k="123" />
+<hkern g1="V" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="V" 	g2="x" 	k="61" />
+<hkern g1="V" 	g2="v,w,y,yacute,ydieresis" 	k="61" />
+<hkern g1="V" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="195" />
+<hkern g1="V" 	g2="s" 	k="102" />
+<hkern g1="V" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="113" />
+<hkern g1="V" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="V" 	g2="p" 	k="82" />
+<hkern g1="V" 	g2="z" 	k="82" />
+<hkern g1="V" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="143" />
+<hkern g1="Y,Yacute" 	g2="J" 	k="143" />
+<hkern g1="Y,Yacute" 	g2="S" 	k="41" />
+<hkern g1="Y,Yacute" 	g2="M" 	k="41" />
+<hkern g1="Y,Yacute" 	g2="g" 	k="184" />
+<hkern g1="Y,Yacute" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="Y,Yacute" 	g2="x" 	k="113" />
+<hkern g1="Y,Yacute" 	g2="v,w,y,yacute,ydieresis" 	k="92" />
+<hkern g1="Y,Yacute" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="246" />
+<hkern g1="Y,Yacute" 	g2="s" 	k="164" />
+<hkern g1="Y,Yacute" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="102" />
+<hkern g1="Y,Yacute" 	g2="f,t,uniFB03,uniFB04" 	k="82" />
+<hkern g1="Y,Yacute" 	g2="p" 	k="143" />
+<hkern g1="Y,Yacute" 	g2="z" 	k="123" />
+<hkern g1="Y,Yacute" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="205" />
+<hkern g1="X" 	g2="M" 	k="-20" />
+<hkern g1="X" 	g2="g" 	k="41" />
+<hkern g1="X" 	g2="v,w,y,yacute,ydieresis" 	k="82" />
+<hkern g1="X" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="92" />
+<hkern g1="X" 	g2="s" 	k="41" />
+<hkern g1="X" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="X" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="41" />
+<hkern g1="W" 	g2="J" 	k="123" />
+<hkern g1="W" 	g2="S" 	k="20" />
+<hkern g1="W" 	g2="M" 	k="41" />
+<hkern g1="W" 	g2="g" 	k="123" />
+<hkern g1="W" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="W" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="195" />
+<hkern g1="W" 	g2="s" 	k="102" />
+<hkern g1="W" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="113" />
+<hkern g1="W" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="W" 	g2="p" 	k="82" />
+<hkern g1="W" 	g2="z" 	k="82" />
+<hkern g1="W" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="143" />
+<hkern g1="K" 	g2="S" 	k="41" />
+<hkern g1="K" 	g2="g" 	k="61" />
+<hkern g1="K" 	g2="v,w,y,yacute,ydieresis" 	k="82" />
+<hkern g1="K" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="164" />
+<hkern g1="K" 	g2="s" 	k="61" />
+<hkern g1="K" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="20" />
+<hkern g1="K" 	g2="f,t,uniFB03,uniFB04" 	k="61" />
+<hkern g1="K" 	g2="z" 	k="61" />
+<hkern g1="K" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="41" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="J" 	k="41" />
+<hkern g1="M" 	g2="g" 	k="20" />
+<hkern g1="M" 	g2="colon,semicolon" 	k="41" />
+<hkern g1="M" 	g2="v,w,y,yacute,ydieresis" 	k="20" />
+<hkern g1="M" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="M" 	g2="p" 	k="20" />
+<hkern g1="M" 	g2="quotesingle" 	k="41" />
+<hkern g1="S" 	g2="S" 	k="31" />
+<hkern g1="S" 	g2="colon,semicolon" 	k="61" />
+<hkern g1="S" 	g2="x" 	k="41" />
+<hkern g1="S" 	g2="v,w,y,yacute,ydieresis" 	k="61" />
+<hkern g1="S" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="S" 	g2="f,t,uniFB03,uniFB04" 	k="51" />
+<hkern g1="S" 	g2="quotesingle" 	k="41" />
+<hkern g1="P,R" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="k" 	g2="g" 	k="20" />
+<hkern g1="k" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="61" />
+<hkern g1="k" 	g2="s" 	k="20" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="g" 	k="31" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="v,w,y,yacute,ydieresis" 	k="-20" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="s" 	k="20" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="41" />
+<hkern g1="l" 	g2="v,w,y,yacute,ydieresis" 	k="82" />
+<hkern g1="l" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="82" />
+<hkern g1="l" 	g2="s" 	k="41" />
+<hkern g1="l" 	g2="f,t,uniFB03,uniFB04" 	k="82" />
+<hkern g1="l" 	g2="quotesingle" 	k="61" />
+<hkern g1="f" 	g2="g" 	k="82" />
+<hkern g1="f" 	g2="hyphen,equal,endash,emdash" 	k="82" />
+<hkern g1="f" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="61" />
+<hkern g1="f" 	g2="s" 	k="41" />
+<hkern g1="f" 	g2="m,n,r,u,ntilde,ugrave,uacute,ucircumflex,udieresis" 	k="61" />
+<hkern g1="f" 	g2="f,t,uniFB03,uniFB04" 	k="61" />
+<hkern g1="f" 	g2="p" 	k="41" />
+<hkern g1="f" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="colon,semicolon" 	k="41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="hyphen,equal,endash,emdash" 	k="-41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="x" 	k="92" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="v,w,y,yacute,ydieresis" 	k="61" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="s" 	k="31" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="quotesingle" 	k="82" />
+<hkern g1="x" 	g2="g" 	k="41" />
+<hkern g1="x" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="102" />
+<hkern g1="x" 	g2="s" 	k="20" />
+<hkern g1="x" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="41" />
+<hkern g1="s" 	g2="g" 	k="20" />
+<hkern g1="s" 	g2="colon,semicolon" 	k="82" />
+<hkern g1="s" 	g2="x" 	k="20" />
+<hkern g1="s" 	g2="v,w,y,yacute,ydieresis" 	k="20" />
+<hkern g1="s" 	g2="s" 	k="20" />
+<hkern g1="s" 	g2="f,t,uniFB03,uniFB04" 	k="41" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="colon,semicolon" 	k="41" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="v,w,y,yacute,ydieresis" 	k="20" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="quotesingle" 	k="61" />
+<hkern g1="r" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="h,m,n,ntilde" 	g2="v,w,y,yacute,ydieresis" 	k="31" />
+<hkern g1="h,m,n,ntilde" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="20" />
+<hkern g1="h,m,n,ntilde" 	g2="s" 	k="20" />
+<hkern g1="h,m,n,ntilde" 	g2="f,t,uniFB03,uniFB04" 	k="20" />
+<hkern g1="h,m,n,ntilde" 	g2="quotesingle" 	k="102" />
+<hkern g1="g" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="51" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="l" 	k="51" />
+<hkern g1="c,ccedilla" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="41" />
+<hkern g1="C,Ccedilla" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="102" />
+<hkern g1="C,Ccedilla" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="61" />
+<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" 	g2="v,w" 	k="41" />
+<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" 	g2="x" 	k="10" />
+<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" 	g2="y" 	k="37" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="82" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="T" 	k="195" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="Y" 	k="246" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="V" 	k="246" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="61" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="184" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="W" 	k="246" />
+<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="82" />
+<hkern g1="quoteleft,quotedblleft" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="61" />
+<hkern g1="quoteleft,quotedblleft" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="184" />
+<hkern g1="F" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="41" />
+<hkern g1="F" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="184" />
+<hkern g1="F" 	g2="comma,period,ellipsis" 	k="307" />
+<hkern g1="L" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="61" />
+<hkern g1="L" 	g2="T" 	k="246" />
+<hkern g1="L" 	g2="Y" 	k="184" />
+<hkern g1="L" 	g2="V" 	k="236" />
+<hkern g1="L" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="205" />
+<hkern g1="L" 	g2="comma,period,ellipsis" 	k="41" />
+<hkern g1="L" 	g2="W" 	k="164" />
+<hkern g1="L" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="113" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="T" 	k="41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="Y" 	k="102" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="V" 	k="72" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="41" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="61" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="113" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="comma,period,ellipsis" 	k="133" />
+<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash" 	g2="W" 	k="72" />
+<hkern g1="T" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="41" />
+<hkern g1="T" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="41" />
+<hkern g1="T" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="236" />
+<hkern g1="T" 	g2="comma,period,ellipsis" 	k="164" />
+<hkern g1="V" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="72" />
+<hkern g1="V" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="82" />
+<hkern g1="V" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="246" />
+<hkern g1="V" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="Y,Yacute" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="113" />
+<hkern g1="Y,Yacute" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="82" />
+<hkern g1="Y,Yacute" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="287" />
+<hkern g1="Y,Yacute" 	g2="comma,period,ellipsis" 	k="276" />
+<hkern g1="X" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="82" />
+<hkern g1="X" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="82" />
+<hkern g1="W" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="72" />
+<hkern g1="W" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="61" />
+<hkern g1="W" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="246" />
+<hkern g1="W" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="K" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="123" />
+<hkern g1="K" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="61" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="92" />
+<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	g2="comma,period,ellipsis" 	k="82" />
+<hkern g1="M" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="20" />
+<hkern g1="M" 	g2="Y" 	k="20" />
+<hkern g1="M" 	g2="V" 	k="41" />
+<hkern g1="M" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="41" />
+<hkern g1="M" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="M" 	g2="comma,period,ellipsis" 	k="31" />
+<hkern g1="M" 	g2="W" 	k="20" />
+<hkern g1="S" 	g2="T" 	k="41" />
+<hkern g1="S" 	g2="V" 	k="-41" />
+<hkern g1="S" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE" 	k="61" />
+<hkern g1="S" 	g2="W" 	k="-20" />
+<hkern g1="P,R" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="41" />
+<hkern g1="P,R" 	g2="Y" 	k="61" />
+<hkern g1="P,R" 	g2="V" 	k="61" />
+<hkern g1="P,R" 	g2="W" 	k="61" />
+<hkern g1="k" 	g2="comma,period,ellipsis" 	k="61" />
+<hkern g1="v,w,y,yacute,ydieresis" 	g2="comma,period,ellipsis" 	k="123" />
+<hkern g1="l" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="123" />
+<hkern g1="f" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="E,F,Egrave,Eacute,Ecircumflex,Edieresis" 	k="82" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="b,o,p,ograve,oacute,ocircumflex,otilde,odieresis,oslash,thorn" 	g2="comma,period,ellipsis" 	k="82" />
+<hkern g1="x" 	g2="comma,period,ellipsis" 	k="41" />
+<hkern g1="s" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="s" 	g2="comma,period,ellipsis" 	k="61" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis,oe" 	g2="comma,period,ellipsis" 	k="61" />
+<hkern g1="r" 	g2="comma,period,ellipsis" 	k="215" />
+<hkern g1="h,m,n,ntilde" 	g2="quoteright,quotesinglbase,quotedblright,quotedblbase" 	k="82" />
+<hkern g1="g" 	g2="comma,period,ellipsis" 	k="82" />
+</font>
+</defs></svg> 
\ No newline at end of file
Binary file Resources/font/exo/exo-regular.ttf has changed
Binary file Resources/font/exo/exo-regular.woff has changed
Binary file Resources/img/about/1.jpg has changed
Binary file Resources/img/about/2.jpg has changed
Binary file Resources/img/about/3.jpg has changed
Binary file Resources/img/about/4.jpg has changed
Binary file Resources/img/about/5.jpg has changed
Binary file Resources/img/about/6.jpg has changed
Binary file Resources/img/about/7.jpg has changed
Binary file Resources/img/about/8.jpg has changed
Binary file Resources/img/icon.png has changed
Binary file Resources/img/splash.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/can.jquery-1.1.6.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,4538 @@
+/*!
+ * CanJS - 1.1.6
+ * http://canjs.us/
+ * Copyright (c) 2013 Bitovi
+ * Mon, 15 Jul 2013 04:14:43 GMT
+ * Licensed MIT
+ * Includes: can/construct/construct.js,can/observe/observe.js,can/observe/compute/compute.js,can/model/model.js,can/view/view.js,can/view/ejs/ejs.js,can/control/control.js,can/route/route.js,can/control/route/route.js,can/observe/backup/backup.js,can/util/object/object.js,can/util/string/string.js
+ * Download from: http://bitbuilder.herokuapp.com/can.custom.js?configuration=jquery&plugins=can%2Fconstruct%2Fconstruct.js&plugins=can%2Fobserve%2Fobserve.js&plugins=can%2Fobserve%2Fcompute%2Fcompute.js&plugins=can%2Fmodel%2Fmodel.js&plugins=can%2Fview%2Fview.js&plugins=can%2Fview%2Fejs%2Fejs.js&plugins=can%2Fcontrol%2Fcontrol.js&plugins=can%2Froute%2Froute.js&plugins=can%2Fcontrol%2Froute%2Froute.js&plugins=can%2Fobserve%2Fbackup%2Fbackup.js&plugins=can%2Futil%2Fobject%2Fobject.js&plugins=can%2Futil%2Fstring%2Fstring.js
+ */
+(function(undefined) {
+
+    // ## can/util/can.js
+    var __m5 = (function() {
+        var can = window.can || {};
+        if (typeof GLOBALCAN === 'undefined' || GLOBALCAN !== false) {
+            window.can = can;
+        }
+
+        can.isDeferred = function(obj) {
+            var isFunction = this.isFunction;
+            // Returns `true` if something looks like a deferred.
+            return obj && isFunction(obj.then) && isFunction(obj.pipe);
+        };
+
+        var cid = 0;
+        can.cid = function(object, name) {
+            if (object._cid) {
+                return object._cid
+            } else {
+                return object._cid = (name || "") + (++cid)
+            }
+        }
+        can.VERSION = '@EDGE';
+        return can;
+    })();
+
+    // ## can/util/array/each.js
+    var __m6 = (function(can) {
+        can.each = function(elements, callback, context) {
+            var i = 0,
+                key;
+            if (elements) {
+                if (typeof elements.length === 'number' && elements.pop) {
+                    if (elements.attr) {
+                        elements.attr('length');
+                    }
+                    for (key = elements.length; i < key; i++) {
+                        if (callback.call(context || elements[i], elements[i], i, elements) === false) {
+                            break;
+                        }
+                    }
+                } else if (elements.hasOwnProperty) {
+                    for (key in elements) {
+                        if (elements.hasOwnProperty(key)) {
+                            if (callback.call(context || elements[key], elements[key], key, elements) === false) {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            return elements;
+        };
+
+        return can;
+    })(__m5);
+
+    // ## can/util/jquery/jquery.js
+    var __m3 = (function($, can) {
+        // _jQuery node list._
+        $.extend(can, $, {
+                trigger: function(obj, event, args) {
+                    if (obj.trigger) {
+                        obj.trigger(event, args);
+                    } else {
+                        $.event.trigger(event, args, obj, true);
+                    }
+                },
+                addEvent: function(ev, cb) {
+                    $([this]).bind(ev, cb);
+                    return this;
+                },
+                removeEvent: function(ev, cb) {
+                    $([this]).unbind(ev, cb);
+                    return this;
+                },
+                // jquery caches fragments, we always needs a new one
+                buildFragment: function(elems, context) {
+                    var oldFragment = $.buildFragment,
+                        ret;
+
+                    elems = [elems];
+                    // Set context per 1.8 logic
+                    context = context || document;
+                    context = !context.nodeType && context[0] || context;
+                    context = context.ownerDocument || context;
+
+                    ret = oldFragment.call(jQuery, elems, context);
+
+                    return ret.cacheable ? $.clone(ret.fragment) : ret.fragment || ret;
+                },
+                $: $,
+                each: can.each
+            });
+
+        // Wrap binding functions.
+        $.each(['bind', 'unbind', 'undelegate', 'delegate'], function(i, func) {
+            can[func] = function() {
+                var t = this[func] ? this : $([this]);
+                t[func].apply(t, arguments);
+                return this;
+            };
+        });
+
+        // Wrap modifier functions.
+        $.each(["append", "filter", "addClass", "remove", "data", "get"], function(i, name) {
+            can[name] = function(wrapped) {
+                return wrapped[name].apply(wrapped, can.makeArray(arguments).slice(1));
+            };
+        });
+
+        // Memory safe destruction.
+        var oldClean = $.cleanData;
+
+        $.cleanData = function(elems) {
+            $.each(elems, function(i, elem) {
+                if (elem) {
+                    can.trigger(elem, "destroyed", [], false);
+                }
+            });
+            oldClean(elems);
+        };
+
+        return can;
+    })(jQuery, __m5, __m6);
+
+    // ## can/util/string/string.js
+    var __m2 = (function(can) {
+        // ##string.js
+        // _Miscellaneous string utility functions._  
+
+        // Several of the methods in this plugin use code adapated from Prototype
+        // Prototype JavaScript framework, version 1.6.0.1.
+        // © 2005-2007 Sam Stephenson
+        var strUndHash = /_|-/,
+            strColons = /\=\=/,
+            strWords = /([A-Z]+)([A-Z][a-z])/g,
+            strLowUp = /([a-z\d])([A-Z])/g,
+            strDash = /([a-z\d])([A-Z])/g,
+            strReplacer = /\{([^\}]+)\}/g,
+            strQuote = /"/g,
+            strSingleQuote = /'/g,
+
+            // Returns the `prop` property from `obj`.
+            // If `add` is true and `prop` doesn't exist in `obj`, create it as an
+            // empty object.
+            getNext = function(obj, prop, add) {
+                var result = obj[prop];
+
+                if (result === undefined && add === true) {
+                    result = obj[prop] = {}
+                }
+                return result
+            },
+
+            // Returns `true` if the object can have properties (no `null`s).
+            isContainer = function(current) {
+                return (/^f|^o/).test(typeof current);
+            };
+
+        can.extend(can, {
+                // Escapes strings for HTML.
+
+                esc: function(content) {
+                    // Convert bad values into empty strings
+                    var isInvalid = content === null || content === undefined || (isNaN(content) && ("" + content === 'NaN'));
+                    return ("" + (isInvalid ? '' : content))
+                        .replace(/&/g, '&amp;')
+                        .replace(/</g, '&lt;')
+                        .replace(/>/g, '&gt;')
+                        .replace(strQuote, '&#34;')
+                        .replace(strSingleQuote, "&#39;");
+                },
+
+
+                getObject: function(name, roots, add) {
+
+                    // The parts of the name we are looking up
+                    // `['App','Models','Recipe']`
+                    var parts = name ? name.split('.') : [],
+                        length = parts.length,
+                        current,
+                        r = 0,
+                        i, container, rootsLength;
+
+                    // Make sure roots is an `array`.
+                    roots = can.isArray(roots) ? roots : [roots || window];
+
+                    rootsLength = roots.length
+
+                    if (!length) {
+                        return roots[0];
+                    }
+
+                    // For each root, mark it as current.
+                    for (r; r < rootsLength; r++) {
+                        current = roots[r];
+                        container = undefined;
+
+                        // Walk current to the 2nd to last object or until there
+                        // is not a container.
+                        for (i = 0; i < length && isContainer(current); i++) {
+                            container = current;
+                            current = getNext(container, parts[i]);
+                        }
+
+                        // If we found property break cycle
+                        if (container !== undefined && current !== undefined) {
+                            break
+                        }
+                    }
+
+                    // Remove property from found container
+                    if (add === false && current !== undefined) {
+                        delete container[parts[i - 1]]
+                    }
+
+                    // When adding property add it to the first root
+                    if (add === true && current === undefined) {
+                        current = roots[0]
+
+                        for (i = 0; i < length && isContainer(current); i++) {
+                            current = getNext(current, parts[i], true);
+                        }
+                    }
+
+                    return current;
+                },
+                // Capitalizes a string.
+
+                capitalize: function(s, cache) {
+                    // Used to make newId.
+                    return s.charAt(0).toUpperCase() + s.slice(1);
+                },
+
+                // Underscores a string.
+
+                underscore: function(s) {
+                    return s
+                        .replace(strColons, '/')
+                        .replace(strWords, '$1_$2')
+                        .replace(strLowUp, '$1_$2')
+                        .replace(strDash, '_')
+                        .toLowerCase();
+                },
+                // Micro-templating.
+
+                sub: function(str, data, remove) {
+                    var obs = [];
+
+                    str = str || '';
+
+                    obs.push(str.replace(strReplacer, function(whole, inside) {
+
+                                // Convert inside to type.
+                                var ob = can.getObject(inside, data, remove === true ? false : undefined);
+
+                                if (ob === undefined) {
+                                    obs = null;
+                                    return "";
+                                }
+
+                                // If a container, push into objs (which will return objects found).
+                                if (isContainer(ob) && obs) {
+                                    obs.push(ob);
+                                    return "";
+                                }
+
+                                return "" + ob;
+                            }));
+
+                    return obs === null ? obs : (obs.length <= 1 ? obs[0] : obs);
+                },
+
+                // These regex's are used throughout the rest of can, so let's make
+                // them available.
+                replacer: strReplacer,
+                undHash: strUndHash
+            });
+        return can;
+    })(__m3);
+
+    // ## can/construct/construct.js
+    var __m1 = (function(can) {
+
+        // ## construct.js
+        // `can.Construct`  
+        // _This is a modified version of
+        // [John Resig's class](http://ejohn.org/blog/simple-javascript-inheritance/).  
+        // It provides class level inheritance and callbacks._
+
+        // A private flag used to initialize a new class instance without
+        // initializing it's bindings.
+        var initializing = 0;
+
+
+        can.Construct = function() {
+            if (arguments.length) {
+                return can.Construct.extend.apply(can.Construct, arguments);
+            }
+        };
+
+
+        can.extend(can.Construct, {
+
+                newInstance: function() {
+                    // Get a raw instance object (`init` is not called).
+                    var inst = this.instance(),
+                        arg = arguments,
+                        args;
+
+                    // Call `setup` if there is a `setup`
+                    if (inst.setup) {
+                        args = inst.setup.apply(inst, arguments);
+                    }
+
+                    // Call `init` if there is an `init`  
+                    // If `setup` returned `args`, use those as the arguments
+                    if (inst.init) {
+                        inst.init.apply(inst, args || arguments);
+                    }
+
+                    return inst;
+                },
+                // Overwrites an object with methods. Used in the `super` plugin.
+                // `newProps` - New properties to add.  
+                // `oldProps` - Where the old properties might be (used with `super`).  
+                // `addTo` - What we are adding to.
+                _inherit: function(newProps, oldProps, addTo) {
+                    can.extend(addTo || newProps, newProps || {})
+                },
+                // used for overwriting a single property.
+                // this should be used for patching other objects
+                // the super plugin overwrites this
+                _overwrite: function(what, oldProps, propName, val) {
+                    what[propName] = val;
+                },
+                // Set `defaults` as the merger of the parent `defaults` and this 
+                // object's `defaults`. If you overwrite this method, make sure to
+                // include option merging logic.
+
+                setup: function(base, fullName) {
+                    this.defaults = can.extend(true, {}, base.defaults, this.defaults);
+                },
+                // Create's a new `class` instance without initializing by setting the
+                // `initializing` flag.
+                instance: function() {
+
+                    // Prevents running `init`.
+                    initializing = 1;
+
+                    var inst = new this();
+
+                    // Allow running `init`.
+                    initializing = 0;
+
+                    return inst;
+                },
+                // Extends classes.
+
+                extend: function(fullName, klass, proto) {
+                    // Figure out what was passed and normalize it.
+                    if (typeof fullName != 'string') {
+                        proto = klass;
+                        klass = fullName;
+                        fullName = null;
+                    }
+
+                    if (!proto) {
+                        proto = klass;
+                        klass = null;
+                    }
+                    proto = proto || {};
+
+                    var _super_class = this,
+                        _super = this.prototype,
+                        name, shortName, namespace, prototype;
+
+                    // Instantiate a base class (but only create the instance,
+                    // don't run the init constructor).
+                    prototype = this.instance();
+
+                    // Copy the properties over onto the new prototype.
+                    can.Construct._inherit(proto, _super, prototype);
+
+                    // The dummy class constructor.
+
+                    function Constructor() {
+                        // All construction is actually done in the init method.
+                        if (!initializing) {
+                            return this.constructor !== Constructor && arguments.length ?
+                            // We are being called without `new` or we are extending.
+                            arguments.callee.extend.apply(arguments.callee, arguments) :
+                            // We are being called with `new`.
+                            this.constructor.newInstance.apply(this.constructor, arguments);
+                        }
+                    }
+
+                    // Copy old stuff onto class (can probably be merged w/ inherit)
+                    for (name in _super_class) {
+                        if (_super_class.hasOwnProperty(name)) {
+                            Constructor[name] = _super_class[name];
+                        }
+                    }
+
+                    // Copy new static properties on class.
+                    can.Construct._inherit(klass, _super_class, Constructor);
+
+                    // Setup namespaces.
+                    if (fullName) {
+
+                        var parts = fullName.split('.'),
+                            shortName = parts.pop(),
+                            current = can.getObject(parts.join('.'), window, true),
+                            namespace = current,
+                            _fullName = can.underscore(fullName.replace(/\./g, "_")),
+                            _shortName = can.underscore(shortName);
+
+
+
+                        current[shortName] = Constructor;
+                    }
+
+                    // Set things that shouldn't be overwritten.
+                    can.extend(Constructor, {
+                            constructor: Constructor,
+                            prototype: prototype,
+
+                            namespace: namespace,
+
+                            _shortName: _shortName,
+
+                            fullName: fullName,
+                            _fullName: _fullName
+                        });
+
+                    // Dojo and YUI extend undefined
+                    if (shortName !== undefined) {
+                        Constructor.shortName = shortName;
+                    }
+
+                    // Make sure our prototype looks nice.
+                    Constructor.prototype.constructor = Constructor;
+
+
+                    // Call the class `setup` and `init`
+                    var t = [_super_class].concat(can.makeArray(arguments)),
+                        args = Constructor.setup.apply(Constructor, t);
+
+                    if (Constructor.init) {
+                        Constructor.init.apply(Constructor, args || t);
+                    }
+
+
+                    return Constructor;
+
+                }
+
+            });
+        return can.Construct;
+    })(__m2);
+
+    // ## can/util/bind/bind.js
+    var __m8 = (function(can) {
+
+
+        // ## Bind helpers
+        can.bindAndSetup = function() {
+            // Add the event to this object
+            can.addEvent.apply(this, arguments);
+            // If not initializing, and the first binding
+            // call bindsetup if the function exists.
+            if (!this._init) {
+                if (!this._bindings) {
+                    this._bindings = 1;
+                    // setup live-binding
+                    this._bindsetup && this._bindsetup();
+
+                } else {
+                    this._bindings++;
+                }
+
+            }
+
+            return this;
+        };
+
+        can.unbindAndTeardown = function(ev, handler) {
+            // Remove the event handler
+            can.removeEvent.apply(this, arguments);
+
+            this._bindings--;
+            // If there are no longer any bindings and
+            // there is a bindteardown method, call it.
+            if (!this._bindings) {
+                this._bindteardown && this._bindteardown();
+            }
+            return this;
+        }
+
+        return can;
+
+    })(__m3);
+
+    // ## can/observe/observe.js
+    var __m7 = (function(can, bind) {
+        // ## observe.js  
+        // `can.Observe`  
+        // _Provides the observable pattern for JavaScript Objects._  
+        // Returns `true` if something is an object with properties of its own.
+        var canMakeObserve = function(obj) {
+            return obj && !can.isDeferred(obj) && (can.isArray(obj) || can.isPlainObject(obj) || (obj instanceof can.Observe));
+        },
+
+            // Removes all listeners.
+            unhookup = function(items, namespace) {
+                return can.each(items, function(item) {
+                    if (item && item.unbind) {
+                        item.unbind("change" + namespace);
+                    }
+                });
+            },
+            // Listens to changes on `child` and "bubbles" the event up.  
+            // `child` - The object to listen for changes on.  
+            // `prop` - The property name is at on.  
+            // `parent` - The parent object of prop.
+            // `ob` - (optional) The Observe object constructor
+            // `list` - (optional) The observable list constructor
+            hookupBubble = function(child, prop, parent, Ob, List) {
+                Ob = Ob || Observe;
+                List = List || Observe.List;
+
+                // If it's an `array` make a list, otherwise a child.
+                if (child instanceof Observe) {
+                    // We have an `observe` already...
+                    // Make sure it is not listening to this already
+                    // It's only listening if it has bindings already.
+                    parent._bindings && unhookup([child], parent._cid);
+                } else if (can.isArray(child)) {
+                    child = new List(child);
+                } else {
+                    child = new Ob(child);
+                }
+                // only listen if something is listening to you
+                if (parent._bindings) {
+                    // Listen to all changes and `batchTrigger` upwards.
+                    bindToChildAndBubbleToParent(child, prop, parent)
+                }
+
+
+                return child;
+            },
+            bindToChildAndBubbleToParent = function(child, prop, parent) {
+                child.bind("change" + parent._cid, function() {
+                    // `batchTrigger` the type on this...
+                    var args = can.makeArray(arguments),
+                        ev = args.shift();
+                    args[0] = (prop === "*" ? [parent.indexOf(child), args[0]] : [prop, args[0]]).join(".");
+
+                    // track objects dispatched on this observe		
+                    ev.triggeredNS = ev.triggeredNS || {};
+
+                    // if it has already been dispatched exit
+                    if (ev.triggeredNS[parent._cid]) {
+                        return;
+                    }
+
+                    ev.triggeredNS[parent._cid] = true;
+                    // send change event with modified attr to parent	
+                    can.trigger(parent, ev, args);
+                    // send modified attr event to parent
+                    //can.trigger(parent, args[0], args);
+                });
+            }
+            // An `id` to track events for a given observe.
+        observeId = 0,
+        // A helper used to serialize an `Observe` or `Observe.List`.  
+        // `observe` - The observable.  
+        // `how` - To serialize with `attr` or `serialize`.  
+        // `where` - To put properties, in an `{}` or `[]`.
+        serialize = function(observe, how, where) {
+            // Go through each property.
+            observe.each(function(val, name) {
+                // If the value is an `object`, and has an `attrs` or `serialize` function.
+                where[name] = canMakeObserve(val) && can.isFunction(val[how]) ?
+                // Call `attrs` or `serialize` to get the original data back.
+                val[how]() :
+                // Otherwise return the value.
+                val;
+            });
+            return where;
+        },
+        attrParts = function(attr, keepKey) {
+            if (keepKey) {
+                return [attr];
+            }
+            return can.isArray(attr) ? attr : ("" + attr).split(".");
+        },
+        // Which batch of events this is for -- might not want to send multiple
+        // messages on the same batch.  This is mostly for event delegation.
+        batchNum = 1,
+        // how many times has start been called without a stop
+        transactions = 0,
+        // an array of events within a transaction
+        batchEvents = [],
+        stopCallbacks = [],
+        makeBindSetup = function(wildcard) {
+            return function() {
+                var parent = this;
+                this._each(function(child, prop) {
+                    if (child && child.bind) {
+                        bindToChildAndBubbleToParent(child, wildcard || prop, parent)
+                    }
+                })
+            };
+        };
+
+
+        var Observe = can.Map = can.Observe = can.Construct({
+
+                // keep so it can be overwritten
+                bind: can.bindAndSetup,
+                unbind: can.unbindAndTeardown,
+                id: "id",
+                canMakeObserve: canMakeObserve,
+                // starts collecting events
+                // takes a callback for after they are updated
+                // how could you hook into after ejs
+
+                startBatch: function(batchStopHandler) {
+                    transactions++;
+                    batchStopHandler && stopCallbacks.push(batchStopHandler);
+                },
+
+                stopBatch: function(force, callStart) {
+                    if (force) {
+                        transactions = 0;
+                    } else {
+                        transactions--;
+                    }
+
+                    if (transactions == 0) {
+                        var items = batchEvents.slice(0),
+                            callbacks = stopCallbacks.slice(0);
+                        batchEvents = [];
+                        stopCallbacks = [];
+                        batchNum++;
+                        callStart && this.startBatch();
+                        can.each(items, function(args) {
+                            can.trigger.apply(can, args);
+                        });
+                        can.each(callbacks, function(cb) {
+                            cb();
+                        });
+                    }
+                },
+
+                triggerBatch: function(item, event, args) {
+                    // Don't send events if initalizing.
+                    if (!item._init) {
+                        if (transactions == 0) {
+                            return can.trigger(item, event, args);
+                        } else {
+                            event = typeof event === "string" ? {
+                                type: event
+                            } :
+                                event;
+                            event.batchNum = batchNum;
+                            batchEvents.push([
+                                    item,
+                                    event,
+                                    args
+                                ]);
+                        }
+                    }
+                },
+
+                keys: function(observe) {
+                    var keys = [];
+                    Observe.__reading && Observe.__reading(observe, '__keys');
+                    for (var keyName in observe._data) {
+                        keys.push(keyName);
+                    }
+                    return keys;
+                }
+            },
+
+            {
+                setup: function(obj) {
+                    // `_data` is where we keep the properties.
+                    this._data = {};
+
+                    // The namespace this `object` uses to listen to events.
+                    can.cid(this, ".observe");
+                    // Sets all `attrs`.
+                    this._init = 1;
+                    this.attr(obj);
+                    this.bind('change' + this._cid, can.proxy(this._changes, this));
+                    delete this._init;
+                },
+                _bindsetup: makeBindSetup(),
+                _bindteardown: function() {
+                    var cid = this._cid;
+                    this._each(function(child) {
+                        unhookup([child], cid)
+                    })
+                },
+                _changes: function(ev, attr, how, newVal, oldVal) {
+                    Observe.triggerBatch(this, {
+                            type: attr,
+                            batchNum: ev.batchNum
+                        }, [newVal, oldVal]);
+                },
+                _triggerChange: function(attr, how, newVal, oldVal) {
+                    Observe.triggerBatch(this, "change", can.makeArray(arguments))
+                },
+                // no live binding iterator
+                _each: function(callback) {
+                    var data = this.__get();
+                    for (var prop in data) {
+                        if (data.hasOwnProperty(prop)) {
+                            callback(data[prop], prop)
+                        }
+                    }
+                },
+
+                attr: function(attr, val) {
+                    // This is super obfuscated for space -- basically, we're checking
+                    // if the type of the attribute is not a `number` or a `string`.
+                    var type = typeof attr;
+                    if (type !== "string" && type !== "number") {
+                        return this._attrs(attr, val)
+                    } else if (arguments.length === 1) { // If we are getting a value.
+                        // Let people know we are reading.
+                        Observe.__reading && Observe.__reading(this, attr)
+                        return this._get(attr)
+                    } else {
+                        // Otherwise we are setting.
+                        this._set(attr, val);
+                        return this;
+                    }
+                },
+
+                each: function() {
+                    Observe.__reading && Observe.__reading(this, '__keys');
+                    return can.each.apply(undefined, [this.__get()].concat(can.makeArray(arguments)))
+                },
+
+                removeAttr: function(attr) {
+                    // Info if this is List or not
+                    var isList = this instanceof can.Observe.List,
+                        // Convert the `attr` into parts (if nested).
+                        parts = attrParts(attr),
+                        // The actual property to remove.
+                        prop = parts.shift(),
+                        // The current value.
+                        current = isList ? this[prop] : this._data[prop];
+
+                    // If we have more parts, call `removeAttr` on that part.
+                    if (parts.length) {
+                        return current.removeAttr(parts)
+                    } else {
+                        if (isList) {
+                            this.splice(prop, 1)
+                        } else if (prop in this._data) {
+                            // Otherwise, `delete`.
+                            delete this._data[prop];
+                            // Create the event.
+                            if (!(prop in this.constructor.prototype)) {
+                                delete this[prop]
+                            }
+                            // Let others know the number of keys have changed
+                            Observe.triggerBatch(this, "__keys");
+                            this._triggerChange(prop, "remove", undefined, current);
+
+                        }
+                        return current;
+                    }
+                },
+                // Reads a property from the `object`.
+                _get: function(attr) {
+                    var value = typeof attr === 'string' && !! ~attr.indexOf('.') && this.__get(attr);
+                    if (value) {
+                        return value;
+                    }
+
+                    // break up the attr (`"foo.bar"`) into `["foo","bar"]`
+                    var parts = attrParts(attr),
+                        // get the value of the first attr name (`"foo"`)
+                        current = this.__get(parts.shift());
+                    // if there are other attributes to read
+                    return parts.length ?
+                    // and current has a value
+                    current ?
+                    // lookup the remaining attrs on current
+                    current._get(parts) :
+                    // or if there's no current, return undefined
+                    undefined :
+                    // if there are no more parts, return current
+                    current;
+                },
+                // Reads a property directly if an `attr` is provided, otherwise
+                // returns the "real" data object itself.
+                __get: function(attr) {
+                    return attr ? this._data[attr] : this._data;
+                },
+                // Sets `attr` prop as value on this object where.
+                // `attr` - Is a string of properties or an array  of property values.
+                // `value` - The raw value to set.
+                _set: function(attr, value, keepKey) {
+                    // Convert `attr` to attr parts (if it isn't already).
+                    var parts = attrParts(attr, keepKey),
+                        // The immediate prop we are setting.
+                        prop = parts.shift(),
+                        // The current value.
+                        current = this.__get(prop);
+
+                    // If we have an `object` and remaining parts.
+                    if (canMakeObserve(current) && parts.length) {
+                        // That `object` should set it (this might need to call attr).
+                        current._set(parts, value)
+                    } else if (!parts.length) {
+                        // We're in "real" set territory.
+                        if (this.__convert) {
+                            value = this.__convert(prop, value)
+                        }
+                        this.__set(prop, value, current)
+                    } else {
+                        throw "can.Observe: Object does not exist"
+                    }
+                },
+                __set: function(prop, value, current) {
+
+                    // Otherwise, we are setting it on this `object`.
+                    // TODO: Check if value is object and transform
+                    // are we changing the value.
+                    if (value !== current) {
+                        // Check if we are adding this for the first time --
+                        // if we are, we need to create an `add` event.
+                        var changeType = this.__get().hasOwnProperty(prop) ? "set" : "add";
+
+                        // Set the value on data.
+                        this.___set(prop,
+
+                            // If we are getting an object.
+                            canMakeObserve(value) ?
+
+                            // Hook it up to send event.
+                            hookupBubble(value, prop, this) :
+                            // Value is normal.
+                            value);
+
+                        if (changeType == "add") {
+                            // If there is no current value, let others know that
+                            // the the number of keys have changed
+
+                            Observe.triggerBatch(this, "__keys", undefined);
+
+                        }
+                        // `batchTrigger` the change event.
+                        this._triggerChange(prop, changeType, value, current);
+
+                        //Observe.triggerBatch(this, prop, [value, current]);
+                        // If we can stop listening to our old value, do it.
+                        current && unhookup([current], this._cid);
+                    }
+
+                },
+                // Directly sets a property on this `object`.
+                ___set: function(prop, val) {
+                    this._data[prop] = val;
+                    // Add property directly for easy writing.
+                    // Check if its on the `prototype` so we don't overwrite methods like `attrs`.
+                    if (!(prop in this.constructor.prototype)) {
+                        this[prop] = val
+                    }
+                },
+
+
+                bind: can.bindAndSetup,
+
+                unbind: can.unbindAndTeardown,
+
+                serialize: function() {
+                    return serialize(this, 'serialize', {});
+                },
+
+                _attrs: function(props, remove) {
+
+                    if (props === undefined) {
+                        return serialize(this, 'attr', {})
+                    }
+
+                    props = can.extend({}, props);
+                    var prop,
+                        self = this,
+                        newVal;
+                    Observe.startBatch();
+                    this.each(function(curVal, prop) {
+                        newVal = props[prop];
+
+                        // If we are merging...
+                        if (newVal === undefined) {
+                            remove && self.removeAttr(prop);
+                            return;
+                        }
+
+                        if (self.__convert) {
+                            newVal = self.__convert(prop, newVal)
+                        }
+
+                        // if we're dealing with models, want to call _set to let converter run
+                        if (newVal instanceof can.Observe) {
+                            self.__set(prop, newVal, curVal)
+                            // if its an object, let attr merge
+                        } else if (canMakeObserve(curVal) && canMakeObserve(newVal) && curVal.attr) {
+                            curVal.attr(newVal, remove)
+                            // otherwise just set
+                        } else if (curVal != newVal) {
+                            self.__set(prop, newVal, curVal)
+                        }
+
+                        delete props[prop];
+                    })
+                    // Add remaining props.
+                    for (var prop in props) {
+                        newVal = props[prop];
+                        this._set(prop, newVal, true)
+                    }
+                    Observe.stopBatch()
+                    return this;
+                },
+
+
+                compute: function(prop) {
+                    return can.compute(this, prop);
+                }
+            });
+        // Helpers for `observable` lists.
+        var splice = [].splice,
+
+            list = Observe(
+
+                {
+                    setup: function(instances, options) {
+                        this.length = 0;
+                        can.cid(this, ".observe")
+                        this._init = 1;
+                        if (can.isDeferred(instances)) {
+                            this.replace(instances)
+                        } else {
+                            this.push.apply(this, can.makeArray(instances || []));
+                        }
+                        // this change needs to be ignored
+                        this.bind('change' + this._cid, can.proxy(this._changes, this));
+                        can.extend(this, options);
+                        delete this._init;
+                    },
+                    _triggerChange: function(attr, how, newVal, oldVal) {
+
+                        Observe.prototype._triggerChange.apply(this, arguments)
+                        // `batchTrigger` direct add and remove events...
+                        if (!~attr.indexOf('.')) {
+
+                            if (how === 'add') {
+                                Observe.triggerBatch(this, how, [newVal, +attr]);
+                                Observe.triggerBatch(this, 'length', [this.length]);
+                            } else if (how === 'remove') {
+                                Observe.triggerBatch(this, how, [oldVal, +attr]);
+                                Observe.triggerBatch(this, 'length', [this.length]);
+                            } else {
+                                Observe.triggerBatch(this, how, [newVal, +attr])
+                            }
+
+                        }
+
+                    },
+                    __get: function(attr) {
+                        return attr ? this[attr] : this;
+                    },
+                    ___set: function(attr, val) {
+                        this[attr] = val;
+                        if (+attr >= this.length) {
+                            this.length = (+attr + 1)
+                        }
+                    },
+                    _each: function(callback) {
+                        var data = this.__get();
+                        for (var i = 0; i < data.length; i++) {
+                            callback(data[i], i)
+                        }
+                    },
+                    _bindsetup: makeBindSetup("*"),
+                    // Returns the serialized form of this list.
+
+                    serialize: function() {
+                        return serialize(this, 'serialize', []);
+                    },
+
+                    splice: function(index, howMany) {
+                        var args = can.makeArray(arguments),
+                            i;
+
+                        for (i = 2; i < args.length; i++) {
+                            var val = args[i];
+                            if (canMakeObserve(val)) {
+                                args[i] = hookupBubble(val, "*", this, this.constructor.Observe, this.constructor)
+                            }
+                        }
+                        if (howMany === undefined) {
+                            howMany = args[1] = this.length - index;
+                        }
+                        var removed = splice.apply(this, args);
+                        can.Observe.startBatch();
+                        if (howMany > 0) {
+                            this._triggerChange("" + index, "remove", undefined, removed);
+                            unhookup(removed, this._cid);
+                        }
+                        if (args.length > 2) {
+                            this._triggerChange("" + index, "add", args.slice(2), removed);
+                        }
+                        can.Observe.stopBatch();
+                        return removed;
+                    },
+
+                    _attrs: function(items, remove) {
+                        if (items === undefined) {
+                            return serialize(this, 'attr', []);
+                        }
+
+                        // Create a copy.
+                        items = can.makeArray(items);
+
+                        Observe.startBatch();
+                        this._updateAttrs(items, remove);
+                        Observe.stopBatch()
+                    },
+
+                    _updateAttrs: function(items, remove) {
+                        var len = Math.min(items.length, this.length);
+
+                        for (var prop = 0; prop < len; prop++) {
+                            var curVal = this[prop],
+                                newVal = items[prop];
+
+                            if (canMakeObserve(curVal) && canMakeObserve(newVal)) {
+                                curVal.attr(newVal, remove)
+                            } else if (curVal != newVal) {
+                                this._set(prop, newVal)
+                            } else {
+
+                            }
+                        }
+                        if (items.length > this.length) {
+                            // Add in the remaining props.
+                            this.push.apply(this, items.slice(this.length));
+                        } else if (items.length < this.length && remove) {
+                            this.splice(items.length)
+                        }
+                    }
+                }),
+
+            // Converts to an `array` of arguments.
+            getArgs = function(args) {
+                return args[0] && can.isArray(args[0]) ?
+                    args[0] :
+                    can.makeArray(args);
+            };
+        // Create `push`, `pop`, `shift`, and `unshift`
+        can.each({
+
+                push: "length",
+
+                unshift: 0
+            },
+            // Adds a method
+            // `name` - The method name.
+            // `where` - Where items in the `array` should be added.
+
+            function(where, name) {
+                var orig = [][name]
+                list.prototype[name] = function() {
+                    // Get the items being added.
+                    var args = [],
+                        // Where we are going to add items.
+                        len = where ? this.length : 0,
+                        i = arguments.length,
+                        res,
+                        val,
+                        constructor = this.constructor;
+
+                    // Go through and convert anything to an `observe` that needs to be converted.
+                    while (i--) {
+                        val = arguments[i];
+                        args[i] = canMakeObserve(val) ?
+                            hookupBubble(val, "*", this, this.constructor.Observe, this.constructor) :
+                            val;
+                    }
+
+                    // Call the original method.
+                    res = orig.apply(this, args);
+
+                    if (!this.comparator || args.length) {
+
+                        this._triggerChange("" + len, "add", args, undefined);
+                    }
+
+                    return res;
+                }
+            });
+
+        can.each({
+
+                pop: "length",
+
+                shift: 0
+            },
+            // Creates a `remove` type method
+
+            function(where, name) {
+                list.prototype[name] = function() {
+
+                    var args = getArgs(arguments),
+                        len = where && this.length ? this.length - 1 : 0;
+
+                    var res = [][name].apply(this, args)
+
+                    // Create a change where the args are
+                    // `len` - Where these items were removed.
+                    // `remove` - Items removed.
+                    // `undefined` - The new values (there are none).
+                    // `res` - The old, removed values (should these be unbound).
+                    this._triggerChange("" + len, "remove", undefined, [res])
+
+                    if (res && res.unbind) {
+                        res.unbind("change" + this._cid)
+                    }
+                    return res;
+                }
+            });
+
+        can.extend(list.prototype, {
+
+                indexOf: function(item) {
+                    this.attr('length')
+                    return can.inArray(item, this)
+                },
+
+
+                join: [].join,
+
+
+                reverse: [].reverse,
+
+
+                slice: function() {
+                    var temp = Array.prototype.slice.apply(this, arguments);
+                    return new this.constructor(temp);
+                },
+
+
+                concat: function() {
+                    var args = [];
+                    can.each(can.makeArray(arguments), function(arg, i) {
+                        args[i] = arg instanceof can.Observe.List ? arg.serialize() : arg;
+                    });
+                    return new this.constructor(Array.prototype.concat.apply(this.serialize(), args));
+                },
+
+
+                forEach: function(cb, thisarg) {
+                    can.each(this, cb, thisarg || this);
+                },
+
+
+                replace: function(newList) {
+                    if (can.isDeferred(newList)) {
+                        newList.then(can.proxy(this.replace, this));
+                    } else {
+                        this.splice.apply(this, [0, this.length].concat(can.makeArray(newList || [])));
+                    }
+
+                    return this;
+                }
+            });
+
+        can.List = Observe.List = list;
+        Observe.setup = function() {
+            can.Construct.setup.apply(this, arguments);
+            // I would prefer not to do it this way. It should
+            // be using the attributes plugin to do this type of conversion.
+            this.List = Observe.List({
+                    Observe: this
+                }, {});
+        }
+        return Observe;
+    })(__m3, __m8, __m1);
+
+    // ## can/observe/compute/compute.js
+    var __m9 = (function(can, bind) {
+
+        // returns the
+        // - observes and attr methods are called by func
+        // - the value returned by func
+        // ex: `{value: 100, observed: [{obs: o, attr: "completed"}]}`
+        var getValueAndObserved = function(func, self) {
+
+            var oldReading;
+            if (can.Observe) {
+                // Set a callback on can.Observe to know
+                // when an attr is read.
+                // Keep a reference to the old reader
+                // if there is one.  This is used
+                // for nested live binding.
+                oldReading = can.Observe.__reading;
+                can.Observe.__reading = function(obj, attr) {
+                    // Add the observe and attr that was read
+                    // to `observed`
+                    observed.push({
+                            obj: obj,
+                            attr: attr + ""
+                        });
+                };
+            }
+
+            var observed = [],
+                // Call the "wrapping" function to get the value. `observed`
+                // will have the observe/attribute pairs that were read.
+                value = func.call(self);
+
+            // Set back so we are no longer reading.
+            if (can.Observe) {
+                can.Observe.__reading = oldReading;
+            }
+            return {
+                value: value,
+                observed: observed
+            };
+        },
+            // Calls `callback(newVal, oldVal)` everytime an observed property
+            // called within `getterSetter` is changed and creates a new result of `getterSetter`.
+            // Also returns an object that can teardown all event handlers.
+            computeBinder = function(getterSetter, context, callback, computeState) {
+                // track what we are observing
+                var observing = {},
+                    // a flag indicating if this observe/attr pair is already bound
+                    matched = true,
+                    // the data to return 
+                    data = {
+                        // we will maintain the value while live-binding is taking place
+                        value: undefined,
+                        // a teardown method that stops listening
+                        teardown: function() {
+                            for (var name in observing) {
+                                var ob = observing[name];
+                                ob.observe.obj.unbind(ob.observe.attr, onchanged);
+                                delete observing[name];
+                            }
+                        }
+                    },
+                    batchNum;
+
+                // when a property value is changed
+                var onchanged = function(ev) {
+                    // If the compute is no longer bound (because the same change event led to an unbind)
+                    // then do not call getValueAndBind, or we will leak bindings.
+                    if (computeState && !computeState.bound) {
+                        return;
+                    }
+                    if (ev.batchNum === undefined || ev.batchNum !== batchNum) {
+                        // store the old value
+                        var oldValue = data.value,
+                            // get the new value
+                            newvalue = getValueAndBind();
+
+                        // update the value reference (in case someone reads)
+                        data.value = newvalue;
+                        // if a change happened
+                        if (newvalue !== oldValue) {
+                            callback(newvalue, oldValue);
+                        }
+                        batchNum = batchNum = ev.batchNum;
+                    }
+
+
+                };
+
+                // gets the value returned by `getterSetter` and also binds to any attributes
+                // read by the call
+                var getValueAndBind = function() {
+                    var info = getValueAndObserved(getterSetter, context),
+                        newObserveSet = info.observed;
+
+                    var value = info.value;
+                    matched = !matched;
+
+                    // go through every attribute read by this observe
+                    can.each(newObserveSet, function(ob) {
+                        // if the observe/attribute pair is being observed
+                        if (observing[ob.obj._cid + "|" + ob.attr]) {
+                            // mark at as observed
+                            observing[ob.obj._cid + "|" + ob.attr].matched = matched;
+                        } else {
+                            // otherwise, set the observe/attribute on oldObserved, marking it as being observed
+                            observing[ob.obj._cid + "|" + ob.attr] = {
+                                matched: matched,
+                                observe: ob
+                            };
+                            ob.obj.bind(ob.attr, onchanged);
+                        }
+                    });
+
+                    // Iterate through oldObserved, looking for observe/attributes
+                    // that are no longer being bound and unbind them
+                    for (var name in observing) {
+                        var ob = observing[name];
+                        if (ob.matched !== matched) {
+                            ob.observe.obj.unbind(ob.observe.attr, onchanged);
+                            delete observing[name];
+                        }
+                    }
+                    return value;
+                };
+                // set the initial value
+                data.value = getValueAndBind();
+
+                data.isListening = !can.isEmptyObject(observing);
+                return data;
+            }
+
+            // if no one is listening ... we can not calculate every time
+
+        can.compute = function(getterSetter, context, eventName) {
+            if (getterSetter && getterSetter.isComputed) {
+                return getterSetter;
+            }
+            // stores the result of computeBinder
+            var computedData,
+                // how many listeners to this this compute
+                bindings = 0,
+                // the computed object
+                computed,
+                // an object that keeps track if the computed is bound
+                // onchanged needs to know this. It's possible a change happens and results in
+                // something that unbinds the compute, it needs to not to try to recalculate who it
+                // is listening to
+                computeState = {
+                    bound: false,
+                    // true if this compute is calculated from other computes and observes
+                    hasDependencies: false
+                },
+                // The following functions are overwritten depending on how compute() is called
+                // a method to setup listening
+                on = function() {},
+                // a method to teardown listening
+                off = function() {},
+                // the current cached value (only valid if bound = true)
+                value,
+                // how to read the value
+                get = function() {
+                    return value
+                },
+                // sets the value
+                set = function(newVal) {
+                    value = newVal;
+                },
+                // this compute can be a dependency of other computes
+                canReadForChangeEvent = true;
+
+            computed = function(newVal) {
+                // setting ...
+                if (arguments.length) {
+                    // save a reference to the old value
+                    var old = value;
+
+                    // setter may return a value if 
+                    // setter is for a value maintained exclusively by this compute
+                    var setVal = set.call(context, newVal, old);
+
+                    // if this has dependencies return the current value
+                    if (computed.hasDependencies) {
+                        return get.call(context);
+                    }
+
+                    if (setVal === undefined) {
+                        // it's possible, like with the DOM, setting does not
+                        // fire a change event, so we must read
+                        value = get.call(context);
+                    } else {
+                        value = setVal;
+                    }
+                    // fire the change
+                    if (old !== value) {
+                        can.Observe.triggerBatch(computed, "change", [value, old]);
+                    }
+                    return value;
+                } else {
+                    // Let others know to listen to changes in this compute
+                    if (can.Observe.__reading && canReadForChangeEvent) {
+                        can.Observe.__reading(computed, 'change');
+                    }
+                    // if we are bound, use the cached value
+                    if (computeState.bound) {
+                        return value;
+                    } else {
+                        return get.call(context);
+                    }
+                }
+            }
+            if (typeof getterSetter === "function") {
+                set = getterSetter;
+                get = getterSetter;
+                canReadForChangeEvent = eventName === false ? false : true;
+                computed.hasDependencies = false;
+                on = function(update) {
+                    computedData = computeBinder(getterSetter, context || this, update, computeState);
+                    computed.hasDependencies = computedData.isListening
+                    value = computedData.value;
+                }
+                off = function() {
+                    computedData && computedData.teardown();
+                }
+            } else if (context) {
+
+                if (typeof context == "string") {
+                    // `can.compute(obj, "propertyName", [eventName])`
+
+                    var propertyName = context,
+                        isObserve = getterSetter instanceof can.Observe;
+                    if (isObserve) {
+                        computed.hasDependencies = true;
+                    }
+                    get = function() {
+                        if (isObserve) {
+                            return getterSetter.attr(propertyName);
+                        } else {
+                            return getterSetter[propertyName];
+                        }
+                    }
+                    set = function(newValue) {
+                        if (isObserve) {
+                            getterSetter.attr(propertyName, newValue)
+                        } else {
+                            getterSetter[propertyName] = newValue;
+                        }
+                    }
+                    var handler;
+                    on = function(update) {
+                        handler = function() {
+                            update(get(), value)
+                        };
+                        can.bind.call(getterSetter, eventName || propertyName, handler)
+
+                        // use getValueAndObserved because
+                        // we should not be indicating that some parent
+                        // reads this property if it happens to be binding on it
+                        value = getValueAndObserved(get).value
+                    }
+                    off = function() {
+                        can.unbind.call(getterSetter, eventName || propertyName, handler)
+                    }
+
+                } else {
+                    // `can.compute(initialValue, setter)`
+                    if (typeof context === "function") {
+                        value = getterSetter;
+                        set = context;
+                    } else {
+                        // `can.compute(initialValue,{get:, set:, on:, off:})`
+                        value = getterSetter;
+                        var options = context;
+                        get = options.get || get;
+                        set = options.set || set;
+                        on = options.on || on;
+                        off = options.off || off;
+                    }
+
+                }
+
+
+
+            } else {
+                // `can.compute(5)`
+                value = getterSetter;
+            }
+
+            computed.isComputed = true;
+
+            can.cid(computed, "compute")
+
+            var updater = function(newValue, oldValue) {
+                value = newValue;
+                // might need a way to look up new and oldVal
+                can.Observe.triggerBatch(computed, "change", [newValue, oldValue])
+            }
+
+            return can.extend(computed, {
+                    _bindsetup: function() {
+                        computeState.bound = true;
+                        // setup live-binding
+                        on.call(this, updater)
+                    },
+                    _bindteardown: function() {
+                        off.call(this, updater)
+                        computeState.bound = false;
+                    },
+
+                    bind: can.bindAndSetup,
+
+                    unbind: can.unbindAndTeardown
+                });
+        };
+        can.compute.binder = computeBinder;
+        return can.compute;
+    })(__m3, __m8);
+
+    // ## can/model/model.js
+    var __m10 = (function(can) {
+
+        // ## model.js  
+        // `can.Model`  
+        // _A `can.Observe` that connects to a RESTful interface._
+        // Generic deferred piping function
+
+        var pipe = function(def, model, func) {
+            var d = new can.Deferred();
+            def.then(function() {
+                var args = can.makeArray(arguments);
+                args[0] = model[func](args[0]);
+                d.resolveWith(d, args);
+            }, function() {
+                d.rejectWith(this, arguments);
+            });
+
+            if (typeof def.abort === 'function') {
+                d.abort = function() {
+                    return def.abort();
+                }
+            }
+
+            return d;
+        },
+            modelNum = 0,
+            ignoreHookup = /change.observe\d+/,
+            getId = function(inst) {
+                // Instead of using attr, use __get for performance.
+                // Need to set reading
+                can.Observe.__reading && can.Observe.__reading(inst, inst.constructor.id)
+                return inst.__get(inst.constructor.id);
+            },
+            // Ajax `options` generator function
+            ajax = function(ajaxOb, data, type, dataType, success, error) {
+
+                var params = {};
+
+                // If we get a string, handle it.
+                if (typeof ajaxOb == "string") {
+                    // If there's a space, it's probably the type.
+                    var parts = ajaxOb.split(/\s+/);
+                    params.url = parts.pop();
+                    if (parts.length) {
+                        params.type = parts.pop();
+                    }
+                } else {
+                    can.extend(params, ajaxOb);
+                }
+
+                // If we are a non-array object, copy to a new attrs.
+                params.data = typeof data == "object" && !can.isArray(data) ?
+                    can.extend(params.data || {}, data) : data;
+
+                // Get the url with any templated values filled out.
+                params.url = can.sub(params.url, params.data, true);
+
+                return can.ajax(can.extend({
+                            type: type || "post",
+                            dataType: dataType || "json",
+                            success: success,
+                            error: error
+                        }, params));
+            },
+            makeRequest = function(self, type, success, error, method) {
+                var args;
+                // if we pass an array as `self` it it means we are coming from
+                // the queued request, and we're passing already serialized data
+                // self's signature will be: [self, serializedData]
+                if (can.isArray(self)) {
+                    args = self[1];
+                    self = self[0];
+                } else {
+                    args = self.serialize();
+                }
+                args = [args];
+                var deferred,
+                    // The model.
+                    model = self.constructor,
+                    jqXHR;
+
+                // `destroy` does not need data.
+                if (type == 'destroy') {
+                    args.shift();
+                }
+                // `update` and `destroy` need the `id`.
+                if (type !== 'create') {
+                    args.unshift(getId(self));
+                }
+
+
+                jqXHR = model[type].apply(model, args);
+
+                deferred = jqXHR.pipe(function(data) {
+                    self[method || type + "d"](data, jqXHR);
+                    return self;
+                });
+
+                // Hook up `abort`
+                if (jqXHR.abort) {
+                    deferred.abort = function() {
+                        jqXHR.abort();
+                    };
+                }
+
+                deferred.then(success, error);
+                return deferred;
+            },
+
+            // This object describes how to make an ajax request for each ajax method.  
+            // The available properties are:
+            //		`url` - The default url to use as indicated as a property on the model.
+            //		`type` - The default http request type
+            //		`data` - A method that takes the `arguments` and returns `data` used for ajax.
+
+            ajaxMethods = {
+
+                create: {
+                    url: "_shortName",
+                    type: "post"
+                },
+
+                update: {
+                    data: function(id, attrs) {
+                        attrs = attrs || {};
+                        var identity = this.id;
+                        if (attrs[identity] && attrs[identity] !== id) {
+                            attrs["new" + can.capitalize(id)] = attrs[identity];
+                            delete attrs[identity];
+                        }
+                        attrs[identity] = id;
+                        return attrs;
+                    },
+                    type: "put"
+                },
+
+                destroy: {
+                    type: "delete",
+                    data: function(id) {
+                        var args = {};
+                        args.id = args[this.id] = id;
+                        return args;
+                    }
+                },
+
+                findAll: {
+                    url: "_shortName"
+                },
+
+                findOne: {}
+            },
+            // Makes an ajax request `function` from a string.
+            //		`ajaxMethod` - The `ajaxMethod` object defined above.
+            //		`str` - The string the user provided. Ex: `findAll: "/recipes.json"`.
+            ajaxMaker = function(ajaxMethod, str) {
+                // Return a `function` that serves as the ajax method.
+                return function(data) {
+                    // If the ajax method has it's own way of getting `data`, use that.
+                    data = ajaxMethod.data ?
+                        ajaxMethod.data.apply(this, arguments) :
+                    // Otherwise use the data passed in.
+                    data;
+                    // Return the ajax method with `data` and the `type` provided.
+                    return ajax(str || this[ajaxMethod.url || "_url"], data, ajaxMethod.type || "get")
+                }
+            }
+
+
+
+        can.Model = can.Observe({
+                fullName: "can.Model",
+                _reqs: 0,
+                setup: function(base) {
+                    // create store here if someone wants to use model without inheriting from it
+                    this.store = {};
+                    can.Observe.setup.apply(this, arguments);
+                    // Set default list as model list
+                    if (!can.Model) {
+                        return;
+                    }
+                    this.List = ML({
+                            Observe: this
+                        }, {});
+                    var self = this,
+                        clean = can.proxy(this._clean, self);
+
+
+                    // go through ajax methods and set them up
+                    can.each(ajaxMethods, function(method, name) {
+                        // if an ajax method is not a function, it's either
+                        // a string url like findAll: "/recipes" or an
+                        // ajax options object like {url: "/recipes"}
+                        if (!can.isFunction(self[name])) {
+                            // use ajaxMaker to convert that into a function
+                            // that returns a deferred with the data
+                            self[name] = ajaxMaker(method, self[name]);
+                        }
+                        // check if there's a make function like makeFindAll
+                        // these take deferred function and can do special
+                        // behavior with it (like look up data in a store)
+                        if (self["make" + can.capitalize(name)]) {
+                            // pass the deferred method to the make method to get back
+                            // the "findAll" method.
+                            var newMethod = self["make" + can.capitalize(name)](self[name]);
+                            can.Construct._overwrite(self, base, name, function() {
+                                // increment the numer of requests
+                                can.Model._reqs++;
+                                var def = newMethod.apply(this, arguments);
+                                var then = def.then(clean, clean);
+                                then.abort = def.abort;
+
+                                // attach abort to our then and return it
+                                return then;
+                            })
+                        }
+                    });
+
+                    if (self.fullName == "can.Model" || !self.fullName) {
+                        self.fullName = "Model" + (++modelNum);
+                    }
+                    // Add ajax converters.
+                    can.Model._reqs = 0;
+                    this._url = this._shortName + "/{" + this.id + "}"
+                },
+                _ajax: ajaxMaker,
+                _makeRequest: makeRequest,
+                _clean: function() {
+                    can.Model._reqs--;
+                    if (!can.Model._reqs) {
+                        for (var id in this.store) {
+                            if (!this.store[id]._bindings) {
+                                delete this.store[id];
+                            }
+                        }
+                    }
+                    return arguments[0];
+                },
+
+                models: function(instancesRawData, oldList) {
+                    // until "end of turn", increment reqs counter so instances will be added to the store
+                    can.Model._reqs++;
+                    if (!instancesRawData) {
+                        return;
+                    }
+
+                    if (instancesRawData instanceof this.List) {
+                        return instancesRawData;
+                    }
+
+                    // Get the list type.
+                    var self = this,
+                        tmp = [],
+                        res = oldList instanceof can.Observe.List ? oldList : new(self.List || ML),
+                        // Did we get an `array`?
+                        arr = can.isArray(instancesRawData),
+
+                        // Did we get a model list?
+                        ml = (instancesRawData instanceof ML),
+
+                        // Get the raw `array` of objects.
+                        raw = arr ?
+
+                        // If an `array`, return the `array`.
+                        instancesRawData :
+
+                        // Otherwise if a model list.
+                        (ml ?
+
+                            // Get the raw objects from the list.
+                            instancesRawData.serialize() :
+
+                            // Get the object's data.
+                            instancesRawData.data),
+                        i = 0;
+
+
+
+                    if (res.length) {
+                        res.splice(0);
+                    }
+
+                    can.each(raw, function(rawPart) {
+                        tmp.push(self.model(rawPart));
+                    });
+
+                    // We only want one change event so push everything at once
+                    res.push.apply(res, tmp);
+
+                    if (!arr) { // Push other stuff onto `array`.
+                        can.each(instancesRawData, function(val, prop) {
+                            if (prop !== 'data') {
+                                res.attr(prop, val);
+                            }
+                        })
+                    }
+                    // at "end of turn", clean up the store
+                    setTimeout(can.proxy(this._clean, this), 1);
+                    return res;
+                },
+
+                model: function(attributes) {
+                    if (!attributes) {
+                        return;
+                    }
+                    if (attributes instanceof this) {
+                        attributes = attributes.serialize();
+                    }
+                    var id = attributes[this.id],
+                        model = (id || id === 0) && this.store[id] ?
+                            this.store[id].attr(attributes, this.removeAttr || false) : new this(attributes);
+                    if (can.Model._reqs) {
+                        this.store[attributes[this.id]] = model;
+                    }
+                    return model;
+                }
+            },
+
+
+            {
+
+                isNew: function() {
+                    var id = getId(this);
+                    return !(id || id === 0); // If `null` or `undefined`
+                },
+
+                save: function(success, error) {
+                    return makeRequest(this, this.isNew() ? 'create' : 'update', success, error);
+                },
+
+                destroy: function(success, error) {
+                    if (this.isNew()) {
+                        var self = this;
+                        var def = can.Deferred();
+                        def.then(success, error);
+                        return def.done(function(data) {
+                            self.destroyed(data)
+                        }).resolve(self);
+                    }
+                    return makeRequest(this, 'destroy', success, error, 'destroyed');
+                },
+
+                _bindsetup: function() {
+                    this.constructor.store[this.__get(this.constructor.id)] = this;
+                    return can.Observe.prototype._bindsetup.apply(this, arguments);
+                },
+
+                _bindteardown: function() {
+                    delete this.constructor.store[getId(this)];
+                    return can.Observe.prototype._bindteardown.apply(this, arguments)
+                },
+                // Change `id`.
+                ___set: function(prop, val) {
+                    can.Observe.prototype.___set.call(this, prop, val)
+                    // If we add an `id`, move it to the store.
+                    if (prop === this.constructor.id && this._bindings) {
+                        this.constructor.store[getId(this)] = this;
+                    }
+                }
+            });
+
+        can.each({
+                makeFindAll: "models",
+                makeFindOne: "model",
+                makeCreate: "model",
+                makeUpdate: "model"
+            }, function(method, name) {
+                can.Model[name] = function(oldMethod) {
+                    return function() {
+                        var args = can.makeArray(arguments),
+                            oldArgs = can.isFunction(args[1]) ? args.splice(0, 1) : args.splice(0, 2),
+                            def = pipe(oldMethod.apply(this, oldArgs), this, method);
+                        def.then(args[0], args[1]);
+                        // return the original promise
+                        return def;
+                    };
+                };
+            });
+
+        can.each([
+
+                "created",
+
+                "updated",
+
+                "destroyed"
+            ], function(funcName) {
+                can.Model.prototype[funcName] = function(attrs) {
+                    var stub,
+                        constructor = this.constructor;
+
+                    // Update attributes if attributes have been passed
+                    stub = attrs && typeof attrs == 'object' && this.attr(attrs.attr ? attrs.attr() : attrs);
+
+                    // triggers change event that bubble's like
+                    // handler( 'change','1.destroyed' ). This is used
+                    // to remove items on destroyed from Model Lists.
+                    // but there should be a better way.
+                    can.trigger(this, "change", funcName)
+
+
+                    // Call event on the instance's Class
+                    can.trigger(constructor, funcName, this);
+                };
+            });
+
+        // Model lists are just like `Observe.List` except that when their items are 
+        // destroyed, it automatically gets removed from the list.
+
+        var ML = can.Model.List = can.Observe.List({
+                setup: function(params) {
+                    if (can.isPlainObject(params) && !can.isArray(params)) {
+                        can.Observe.List.prototype.setup.apply(this);
+                        this.replace(this.constructor.Observe.findAll(params))
+                    } else {
+                        can.Observe.List.prototype.setup.apply(this, arguments);
+                    }
+                },
+                _changes: function(ev, attr) {
+                    can.Observe.List.prototype._changes.apply(this, arguments);
+                    if (/\w+\.destroyed/.test(attr)) {
+                        var index = this.indexOf(ev.target);
+                        if (index != -1) {
+                            this.splice(index, 1);
+                        }
+                    }
+                }
+            })
+
+        return can.Model;
+    })(__m3, __m7);
+
+    // ## can/view/view.js
+    var __m11 = (function(can) {
+        // ## view.js
+        // `can.view`  
+        // _Templating abstraction._
+
+        var isFunction = can.isFunction,
+            makeArray = can.makeArray,
+            // Used for hookup `id`s.
+            hookupId = 1,
+
+            $view = can.view = can.template = function(view, data, helpers, callback) {
+                // If helpers is a `function`, it is actually a callback.
+                if (isFunction(helpers)) {
+                    callback = helpers;
+                    helpers = undefined;
+                }
+
+                var pipe = function(result) {
+                    return $view.frag(result);
+                },
+                    // In case we got a callback, we need to convert the can.view.render
+                    // result to a document fragment
+                    wrapCallback = isFunction(callback) ? function(frag) {
+                        callback(pipe(frag));
+                    } : null,
+                    // Get the result.
+                    result = $view.render(view, data, helpers, wrapCallback),
+                    deferred = can.Deferred();
+
+                if (isFunction(result)) {
+                    return result;
+                }
+
+                if (can.isDeferred(result)) {
+                    result.then(function(result, data) {
+                        deferred.resolve.call(deferred, pipe(result), data);
+                    }, function() {
+                        deferred.fail.apply(deferred, arguments);
+                    });
+                    return deferred;
+                }
+
+                // Convert it into a dom frag.
+                return pipe(result);
+            };
+
+        can.extend($view, {
+                // creates a frag and hooks it up all at once
+                frag: function(result, parentNode) {
+                    return $view.hookup($view.fragment(result), parentNode);
+                },
+
+                // simply creates a frag
+                // this is used internally to create a frag
+                // insert it
+                // then hook it up
+                fragment: function(result) {
+                    var frag = can.buildFragment(result, document.body);
+                    // If we have an empty frag...
+                    if (!frag.childNodes.length) {
+                        frag.appendChild(document.createTextNode(''));
+                    }
+                    return frag;
+                },
+
+                // Convert a path like string into something that's ok for an `element` ID.
+                toId: function(src) {
+                    return can.map(src.toString().split(/\/|\./g), function(part) {
+                        // Dont include empty strings in toId functions
+                        if (part) {
+                            return part;
+                        }
+                    }).join("_");
+                },
+
+                hookup: function(fragment, parentNode) {
+                    var hookupEls = [],
+                        id,
+                        func;
+
+                    // Get all `childNodes`.
+                    can.each(fragment.childNodes ? can.makeArray(fragment.childNodes) : fragment, function(node) {
+                        if (node.nodeType === 1) {
+                            hookupEls.push(node);
+                            hookupEls.push.apply(hookupEls, can.makeArray(node.getElementsByTagName('*')));
+                        }
+                    });
+
+                    // Filter by `data-view-id` attribute.
+                    can.each(hookupEls, function(el) {
+                        if (el.getAttribute && (id = el.getAttribute('data-view-id')) && (func = $view.hookups[id])) {
+                            func(el, parentNode, id);
+                            delete $view.hookups[id];
+                            el.removeAttribute('data-view-id');
+                        }
+                    });
+
+                    return fragment;
+                },
+
+
+                hookups: {},
+
+
+                hook: function(cb) {
+                    $view.hookups[++hookupId] = cb;
+                    return " data-view-id='" + hookupId + "'";
+                },
+
+
+                cached: {},
+
+                cachedRenderers: {},
+
+
+                cache: true,
+
+
+                register: function(info) {
+                    this.types["." + info.suffix] = info;
+                },
+
+                types: {},
+
+
+                ext: ".ejs",
+
+
+                registerScript: function() {},
+
+
+                preload: function() {},
+
+
+                render: function(view, data, helpers, callback) {
+                    // If helpers is a `function`, it is actually a callback.
+                    if (isFunction(helpers)) {
+                        callback = helpers;
+                        helpers = undefined;
+                    }
+
+                    // See if we got passed any deferreds.
+                    var deferreds = getDeferreds(data);
+
+                    if (deferreds.length) { // Does data contain any deferreds?
+                        // The deferred that resolves into the rendered content...
+                        var deferred = new can.Deferred(),
+                            dataCopy = can.extend({}, data);
+
+                        // Add the view request to the list of deferreds.
+                        deferreds.push(get(view, true))
+
+                        // Wait for the view and all deferreds to finish...
+                        can.when.apply(can, deferreds).then(function(resolved) {
+                            // Get all the resolved deferreds.
+                            var objs = makeArray(arguments),
+                                // Renderer is the last index of the data.
+                                renderer = objs.pop(),
+                                // The result of the template rendering with data.
+                                result;
+
+                            // Make data look like the resolved deferreds.
+                            if (can.isDeferred(data)) {
+                                dataCopy = usefulPart(resolved);
+                            } else {
+                                // Go through each prop in data again and
+                                // replace the defferreds with what they resolved to.
+                                for (var prop in data) {
+                                    if (can.isDeferred(data[prop])) {
+                                        dataCopy[prop] = usefulPart(objs.shift());
+                                    }
+                                }
+                            }
+
+                            // Get the rendered result.
+                            result = renderer(dataCopy, helpers);
+
+                            // Resolve with the rendered view.
+                            deferred.resolve(result, dataCopy);
+
+                            // If there's a `callback`, call it back with the result.
+                            callback && callback(result, dataCopy);
+                        }, function() {
+                            deferred.reject.apply(deferred, arguments)
+                        });
+                        // Return the deferred...
+                        return deferred;
+                    } else {
+                        // No deferreds! Render this bad boy.
+                        var response,
+                            // If there's a `callback` function
+                            async = isFunction(callback),
+                            // Get the `view` type
+                            deferred = get(view, async);
+
+                        // If we are `async`...
+                        if (async) {
+                            // Return the deferred
+                            response = deferred;
+                            // And fire callback with the rendered result.
+                            deferred.then(function(renderer) {
+                                callback(data ? renderer(data, helpers) : renderer);
+                            })
+                        } else {
+                            // if the deferred is resolved, call the cached renderer instead
+                            // this is because it's possible, with recursive deferreds to
+                            // need to render a view while its deferred is _resolving_.  A _resolving_ deferred
+                            // is a deferred that was just resolved and is calling back it's success callbacks.
+                            // If a new success handler is called while resoliving, it does not get fired by
+                            // jQuery's deferred system.  So instead of adding a new callback
+                            // we use the cached renderer.
+                            // We also add __view_id on the deferred so we can look up it's cached renderer.
+                            // In the future, we might simply store either a deferred or the cached result.
+                            if (deferred.state() === "resolved" && deferred.__view_id) {
+                                var currentRenderer = $view.cachedRenderers[deferred.__view_id];
+                                return data ? currentRenderer(data, helpers) : currentRenderer;
+                            } else {
+                                // Otherwise, the deferred is complete, so
+                                // set response to the result of the rendering.
+                                deferred.then(function(renderer) {
+                                    response = data ? renderer(data, helpers) : renderer;
+                                });
+                            }
+                        }
+
+                        return response;
+                    }
+                },
+
+
+                registerView: function(id, text, type, def) {
+                    // Get the renderer function.
+                    var func = (type || $view.types[$view.ext]).renderer(id, text);
+                    def = def || new can.Deferred();
+
+                    // Cache if we are caching.
+                    if ($view.cache) {
+                        $view.cached[id] = def;
+                        def.__view_id = id;
+                        $view.cachedRenderers[id] = func;
+                    }
+
+                    // Return the objects for the response's `dataTypes`
+                    // (in this case view).
+                    return def.resolve(func);
+                }
+            });
+
+        // Makes sure there's a template, if not, have `steal` provide a warning.
+        var checkText = function(text, url) {
+            if (!text.length) {
+
+                throw "can.view: No template or empty template:" + url;
+            }
+        },
+            // `Returns a `view` renderer deferred.  
+            // `url` - The url to the template.  
+            // `async` - If the ajax request should be asynchronous.  
+            // Returns a deferred.
+            get = function(url, async) {
+                var suffix = url.match(/\.[\w\d]+$/),
+                    type,
+                    // If we are reading a script element for the content of the template,
+                    // `el` will be set to that script element.
+                    el,
+                    // A unique identifier for the view (used for caching).
+                    // This is typically derived from the element id or
+                    // the url for the template.
+                    id,
+                    // The ajax request used to retrieve the template content.
+                    jqXHR;
+
+                //If the url has a #, we assume we want to use an inline template
+                //from a script element and not current page's HTML
+                if (url.match(/^#/)) {
+                    url = url.substr(1);
+                }
+                // If we have an inline template, derive the suffix from the `text/???` part.
+                // This only supports `<script>` tags.
+                if (el = document.getElementById(url)) {
+                    suffix = "." + el.type.match(/\/(x\-)?(.+)/)[2];
+                }
+
+                // If there is no suffix, add one.
+                if (!suffix && !$view.cached[url]) {
+                    url += (suffix = $view.ext);
+                }
+
+                if (can.isArray(suffix)) {
+                    suffix = suffix[0]
+                }
+
+                // Convert to a unique and valid id.
+                id = $view.toId(url);
+
+                // If an absolute path, use `steal` to get it.
+                // You should only be using `//` if you are using `steal`.
+                if (url.match(/^\/\//)) {
+                    var sub = url.substr(2);
+                    url = !window.steal ?
+                        sub :
+                        steal.config().root.mapJoin("" + steal.id(sub));
+                }
+
+                // Set the template engine type.
+                type = $view.types[suffix];
+
+                // If it is cached, 
+                if ($view.cached[id]) {
+                    // Return the cached deferred renderer.
+                    return $view.cached[id];
+
+                    // Otherwise if we are getting this from a `<script>` element.
+                } else if (el) {
+                    // Resolve immediately with the element's `innerHTML`.
+                    return $view.registerView(id, el.innerHTML, type);
+                } else {
+                    // Make an ajax request for text.
+                    var d = new can.Deferred();
+                    can.ajax({
+                            async: async,
+                            url: url,
+                            dataType: "text",
+                            error: function(jqXHR) {
+                                checkText("", url);
+                                d.reject(jqXHR);
+                            },
+                            success: function(text) {
+                                // Make sure we got some text back.
+                                checkText(text, url);
+                                $view.registerView(id, text, type, d)
+                            }
+                        });
+                    return d;
+                }
+            },
+            // Gets an `array` of deferreds from an `object`.
+            // This only goes one level deep.
+            getDeferreds = function(data) {
+                var deferreds = [];
+
+                // pull out deferreds
+                if (can.isDeferred(data)) {
+                    return [data]
+                } else {
+                    for (var prop in data) {
+                        if (can.isDeferred(data[prop])) {
+                            deferreds.push(data[prop]);
+                        }
+                    }
+                }
+                return deferreds;
+            },
+            // Gets the useful part of a resolved deferred.
+            // This is for `model`s and `can.ajax` that resolve to an `array`.
+            usefulPart = function(resolved) {
+                return can.isArray(resolved) && resolved[1] === 'success' ? resolved[0] : resolved
+            };
+
+        //!steal-pluginify-remove-start
+        if (window.steal) {
+            steal.type("view js", function(options, success, error) {
+                var type = $view.types["." + options.type],
+                    id = $view.toId(options.id);
+
+                options.text = "steal('" + (type.plugin || "can/view/" + options.type) + "',function(can){return " + "can.view.preload('" + id + "'," + options.text + ");\n})";
+                success();
+            })
+        }
+        //!steal-pluginify-remove-end
+
+        can.extend($view, {
+                register: function(info) {
+                    this.types["." + info.suffix] = info;
+
+                    //!steal-pluginify-remove-start
+                    if (window.steal) {
+                        steal.type(info.suffix + " view js", function(options, success, error) {
+                            var type = $view.types["." + options.type],
+                                id = $view.toId(options.id + '');
+
+                            options.text = type.script(id, options.text)
+                            success();
+                        })
+                    };
+                    //!steal-pluginify-remove-end
+
+                    $view[info.suffix] = function(id, text) {
+                        if (!text) {
+                            // Return a nameless renderer
+                            var renderer = function() {
+                                return $view.frag(renderer.render.apply(this, arguments));
+                            }
+                            renderer.render = function() {
+                                var renderer = info.renderer(null, id);
+                                return renderer.apply(renderer, arguments);
+                            }
+                            return renderer;
+                        }
+
+                        $view.preload(id, info.renderer(id, text));
+                        return can.view(id);
+                    }
+                },
+                registerScript: function(type, id, src) {
+                    return "can.view.preload('" + id + "'," + $view.types["." + type].script(id, src) + ");";
+                },
+                preload: function(id, renderer) {
+                    $view.cached[id] = new can.Deferred().resolve(function(data, helpers) {
+                        return renderer.call(data, data, helpers);
+                    });
+
+                    function frag() {
+                        return $view.frag(renderer.apply(this, arguments));
+                    }
+                    // expose the renderer for mustache
+                    frag.render = renderer;
+                    return frag;
+                }
+
+            });
+
+        return can;
+    })(__m3);
+
+    // ## can/view/elements.js
+    var __m14 = (function() {
+
+        var elements = {
+            tagToContentPropMap: {
+                option: "textContent" in document.createElement("option") ? "textContent" : "innerText",
+                textarea: "value"
+            },
+
+            attrMap: {
+                "class": "className",
+                "value": "value",
+                "innerText": "innerText",
+                "textContent": "textContent",
+                "checked": true,
+                "disabled": true,
+                "readonly": true,
+                "required": true
+            },
+            // elements whos default value we should set
+            defaultValue: ["input", "textarea"],
+            // a map of parent element to child elements
+            tagMap: {
+                "": "span",
+                table: "tbody",
+                tr: "td",
+                ol: "li",
+                ul: "li",
+                tbody: "tr",
+                thead: "tr",
+                tfoot: "tr",
+                select: "option",
+                optgroup: "option"
+            },
+            // a tag's parent element
+            reverseTagMap: {
+                tr: "tbody",
+                option: "select",
+                td: "tr",
+                th: "tr",
+                li: "ul"
+            },
+
+            getParentNode: function(el, defaultParentNode) {
+                return defaultParentNode && el.parentNode.nodeType === 11 ? defaultParentNode : el.parentNode;
+            },
+            // set an attribute on an element
+            setAttr: function(el, attrName, val) {
+                var tagName = el.nodeName.toString().toLowerCase(),
+                    prop = elements.attrMap[attrName];
+                // if this is a special property
+                if (prop === true) {
+                    el[attrName] = true;
+                } else if (prop) {
+                    // set the value as true / false
+                    el[prop] = val;
+                    if (prop === "value" && can.inArray(tagName, elements.defaultValue) >= 0) {
+                        el.defaultValue = val;
+                    }
+                } else {
+                    el.setAttribute(attrName, val);
+                }
+            },
+            // gets the value of an attribute
+            getAttr: function(el, attrName) {
+                // Default to a blank string for IE7/8
+                return (elements.attrMap[attrName] && el[elements.attrMap[attrName]] ?
+                    el[elements.attrMap[attrName]] :
+                    el.getAttribute(attrName)) || '';
+            },
+            // removes the attribute
+            removeAttr: function(el, attrName) {
+                if (elements.attrMap[attrName] === true) {
+                    el[attrName] = false;
+                } else {
+                    el.removeAttribute(attrName);
+                }
+            },
+            contentText: function(text) {
+                if (typeof text == 'string') {
+                    return text;
+                }
+                // If has no value, return an empty string.
+                if (!text && text !== 0) {
+                    return '';
+                }
+                return "" + text;
+            }
+        };
+
+        return elements;
+    })();
+
+    // ## can/view/scanner.js
+    var __m13 = (function(can, elements) {
+
+        var newLine = /(\r|\n)+/g,
+            // Escapes characters starting with `\`.
+            clean = function(content) {
+                return content
+                    .split('\\').join("\\\\")
+                    .split("\n").join("\\n")
+                    .split('"').join('\\"')
+                    .split("\t").join("\\t");
+            },
+            // Returns a tagName to use as a temporary placeholder for live content
+            // looks forward ... could be slow, but we only do it when necessary
+            getTag = function(tagName, tokens, i) {
+                // if a tagName is provided, use that
+                if (tagName) {
+                    return tagName;
+                } else {
+                    // otherwise go searching for the next two tokens like "<",TAG
+                    while (i < tokens.length) {
+                        if (tokens[i] == "<" && elements.reverseTagMap[tokens[i + 1]]) {
+                            return elements.reverseTagMap[tokens[i + 1]];
+                        }
+                        i++;
+                    }
+                }
+                return '';
+            },
+            bracketNum = function(content) {
+                return (--content.split("{").length) - (--content.split("}").length);
+            },
+            myEval = function(script) {
+                eval(script);
+            },
+            attrReg = /([^\s]+)[\s]*=[\s]*$/,
+            // Commands for caching.
+            startTxt = 'var ___v1ew = [];',
+            finishTxt = "return ___v1ew.join('')",
+            put_cmd = "___v1ew.push(",
+            insert_cmd = put_cmd,
+            // Global controls (used by other functions to know where we are).
+            // Are we inside a tag?
+            htmlTag = null,
+            // Are we within a quote within a tag?
+            quote = null,
+            // What was the text before the current quote? (used to get the `attr` name)
+            beforeQuote = null,
+            // Whether a rescan is in progress
+            rescan = null,
+            // Used to mark where the element is.
+            status = function() {
+                // `t` - `1`.
+                // `h` - `0`.
+                // `q` - String `beforeQuote`.
+                return quote ? "'" + beforeQuote.match(attrReg)[1] + "'" : (htmlTag ? 1 : 0);
+            };
+
+        can.view.Scanner = Scanner = function(options) {
+            // Set options on self
+            can.extend(this, {
+                    text: {},
+                    tokens: []
+                }, options);
+
+            // Cache a token lookup
+            this.tokenReg = [];
+            this.tokenSimple = {
+                "<": "<",
+                ">": ">",
+                '"': '"',
+                "'": "'"
+            };
+            this.tokenComplex = [];
+            this.tokenMap = {};
+            for (var i = 0, token; token = this.tokens[i]; i++) {
+
+
+                // Save complex mappings (custom regexp)
+                if (token[2]) {
+                    this.tokenReg.push(token[2]);
+                    this.tokenComplex.push({
+                            abbr: token[1],
+                            re: new RegExp(token[2]),
+                            rescan: token[3]
+                        });
+                }
+                // Save simple mappings (string only, no regexp)
+                else {
+                    this.tokenReg.push(token[1]);
+                    this.tokenSimple[token[1]] = token[0];
+                }
+                this.tokenMap[token[0]] = token[1];
+            }
+
+            // Cache the token registry.
+            this.tokenReg = new RegExp("(" + this.tokenReg.slice(0).concat(["<", ">", '"', "'"]).join("|") + ")", "g");
+        };
+
+        Scanner.prototype = {
+
+            helpers: [
+
+                {
+                    name: /\s*\(([\$\w]+)\)\s*->([^\n]*)/,
+                    fn: function(content) {
+                        var quickFunc = /\s*\(([\$\w]+)\)\s*->([^\n]*)/,
+                            parts = content.match(quickFunc);
+
+                        return "can.proxy(function(__){var " + parts[1] + "=can.$(__);" + parts[2] + "}, this);";
+                    }
+                }
+            ],
+
+            scan: function(source, name) {
+                var tokens = [],
+                    last = 0,
+                    simple = this.tokenSimple,
+                    complex = this.tokenComplex;
+
+                source = source.replace(newLine, "\n");
+                if (this.transform) {
+                    source = this.transform(source);
+                }
+                source.replace(this.tokenReg, function(whole, part) {
+                    // offset is the second to last argument
+                    var offset = arguments[arguments.length - 2];
+
+                    // if the next token starts after the last token ends
+                    // push what's in between
+                    if (offset > last) {
+                        tokens.push(source.substring(last, offset));
+                    }
+
+                    // push the simple token (if there is one)
+                    if (simple[whole]) {
+                        tokens.push(whole);
+                    }
+                    // otherwise lookup complex tokens
+                    else {
+                        for (var i = 0, token; token = complex[i]; i++) {
+                            if (token.re.test(whole)) {
+                                tokens.push(token.abbr);
+                                // Push a rescan function if one exists
+                                if (token.rescan) {
+                                    tokens.push(token.rescan(part));
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    // update the position of the last part of the last token
+                    last = offset + part.length;
+                });
+
+                // if there's something at the end, add it
+                if (last < source.length) {
+                    tokens.push(source.substr(last));
+                }
+
+                var content = '',
+                    buff = [startTxt + (this.text.start || '')],
+                    // Helper `function` for putting stuff in the view concat.
+                    put = function(content, bonus) {
+                        buff.push(put_cmd, '"', clean(content), '"' + (bonus || '') + ');');
+                    },
+                    // A stack used to keep track of how we should end a bracket
+                    // `}`.  
+                    // Once we have a `<%= %>` with a `leftBracket`,
+                    // we store how the file should end here (either `))` or `;`).
+                    endStack = [],
+                    // The last token, used to remember which tag we are in.
+                    lastToken,
+                    // The corresponding magic tag.
+                    startTag = null,
+                    // Was there a magic tag inside an html tag?
+                    magicInTag = false,
+                    // The current tag name.
+                    tagName = '',
+                    // stack of tagNames
+                    tagNames = [],
+                    // Pop from tagNames?
+                    popTagName = false,
+                    // Declared here.
+                    bracketCount,
+                    i = 0,
+                    token,
+                    tmap = this.tokenMap;
+
+                // Reinitialize the tag state goodness.
+                htmlTag = quote = beforeQuote = null;
+
+                for (;
+                    (token = tokens[i++]) !== undefined;) {
+                    if (startTag === null) {
+                        switch (token) {
+                            case tmap.left:
+                            case tmap.escapeLeft:
+                            case tmap.returnLeft:
+                                magicInTag = htmlTag && 1;
+                            case tmap.commentLeft:
+                                // A new line -- just add whatever content within a clean.  
+                                // Reset everything.
+                                startTag = token;
+                                if (content.length) {
+                                    put(content);
+                                }
+                                content = '';
+                                break;
+                            case tmap.escapeFull:
+                                // This is a full line escape (a line that contains only whitespace and escaped logic)
+                                // Break it up into escape left and right
+                                magicInTag = htmlTag && 1;
+                                rescan = 1;
+                                startTag = tmap.escapeLeft;
+                                if (content.length) {
+                                    put(content);
+                                }
+                                rescan = tokens[i++];
+                                content = rescan.content || rescan;
+                                if (rescan.before) {
+                                    put(rescan.before);
+                                }
+                                tokens.splice(i, 0, tmap.right);
+                                break;
+                            case tmap.commentFull:
+                                // Ignore full line comments.
+                                break;
+                            case tmap.templateLeft:
+                                content += tmap.left;
+                                break;
+                            case '<':
+                                // Make sure we are not in a comment.
+                                if (tokens[i].indexOf("!--") !== 0) {
+                                    htmlTag = 1;
+                                    magicInTag = 0;
+                                }
+                                content += token;
+                                break;
+                            case '>':
+                                htmlTag = 0;
+                                // content.substr(-1) doesn't work in IE7/8
+                                var emptyElement = content.substr(content.length - 1) == "/" || content.substr(content.length - 2) == "--";
+                                // if there was a magic tag
+                                // or it's an element that has text content between its tags, 
+                                // but content is not other tags add a hookup
+                                // TODO: we should only add `can.EJS.pending()` if there's a magic tag 
+                                // within the html tags.
+                                if (magicInTag || !popTagName && elements.tagToContentPropMap[tagNames[tagNames.length - 1]]) {
+                                    // make sure / of /> is on the left of pending
+                                    if (emptyElement) {
+                                        put(content.substr(0, content.length - 1), ",can.view.pending(),\"/>\"");
+                                    } else {
+                                        put(content, ",can.view.pending(),\">\"");
+                                    }
+                                    content = '';
+                                    magicInTag = 0;
+                                } else {
+                                    content += token;
+                                }
+                                // if it's a tag like <input/>
+                                if (emptyElement || popTagName) {
+                                    // remove the current tag in the stack
+                                    tagNames.pop();
+                                    // set the current tag to the previous parent
+                                    tagName = tagNames[tagNames.length - 1];
+                                    // Don't pop next time
+                                    popTagName = false;
+                                }
+                                break;
+                            case "'":
+                            case '"':
+                                // If we are in an html tag, finding matching quotes.
+                                if (htmlTag) {
+                                    // We have a quote and it matches.
+                                    if (quote && quote === token) {
+                                        // We are exiting the quote.
+                                        quote = null;
+                                        // Otherwise we are creating a quote.
+                                        // TODO: does this handle `\`?
+                                    } else if (quote === null) {
+                                        quote = token;
+                                        beforeQuote = lastToken;
+                                    }
+                                }
+                            default:
+                                // Track the current tag
+                                if (lastToken === '<') {
+                                    tagName = token.split(/\s/)[0];
+                                    if (tagName.indexOf("/") === 0 && tagNames[tagNames.length - 1] === tagName.substr(1)) {
+                                        // set tagName to the last tagName
+                                        // if there are no more tagNames, we'll rely on getTag.
+                                        tagName = tagNames[tagNames.length - 1];
+                                        popTagName = true;
+                                    } else {
+                                        tagNames.push(tagName);
+                                    }
+                                }
+                                content += token;
+                                break;
+                        }
+                    } else {
+                        // We have a start tag.
+                        switch (token) {
+                            case tmap.right:
+                            case tmap.returnRight:
+                                switch (startTag) {
+                                    case tmap.left:
+                                        // Get the number of `{ minus }`
+                                        bracketCount = bracketNum(content);
+
+                                        // We are ending a block.
+                                        if (bracketCount == 1) {
+
+                                            // We are starting on.
+                                            buff.push(insert_cmd, "can.view.txt(0,'" + getTag(tagName, tokens, i) + "'," + status() + ",this,function(){", startTxt, content);
+
+                                            endStack.push({
+                                                    before: "",
+                                                    after: finishTxt + "}));\n"
+                                                });
+                                        } else {
+
+                                            // How are we ending this statement?
+                                            last = // If the stack has value and we are ending a block...
+                                            endStack.length && bracketCount == -1 ? // Use the last item in the block stack.
+                                            endStack.pop() : // Or use the default ending.
+                                            {
+                                                after: ";"
+                                            };
+
+                                            // If we are ending a returning block, 
+                                            // add the finish text which returns the result of the
+                                            // block.
+                                            if (last.before) {
+                                                buff.push(last.before);
+                                            }
+                                            // Add the remaining content.
+                                            buff.push(content, ";", last.after);
+                                        }
+                                        break;
+                                    case tmap.escapeLeft:
+                                    case tmap.returnLeft:
+                                        // We have an extra `{` -> `block`.
+                                        // Get the number of `{ minus }`.
+                                        bracketCount = bracketNum(content);
+                                        // If we have more `{`, it means there is a block.
+                                        if (bracketCount) {
+                                            // When we return to the same # of `{` vs `}` end with a `doubleParent`.
+                                            endStack.push({
+                                                    before: finishTxt,
+                                                    after: "}));"
+                                                });
+                                        }
+
+                                        var escaped = startTag === tmap.escapeLeft ? 1 : 0,
+                                            commands = {
+                                                insert: insert_cmd,
+                                                tagName: getTag(tagName, tokens, i),
+                                                status: status()
+                                            };
+
+                                        for (var ii = 0; ii < this.helpers.length; ii++) {
+                                            // Match the helper based on helper
+                                            // regex name value
+                                            var helper = this.helpers[ii];
+                                            if (helper.name.test(content)) {
+                                                content = helper.fn(content, commands);
+
+                                                // dont escape partials
+                                                if (helper.name.source == /^>[\s]*\w*/.source) {
+                                                    escaped = 0;
+                                                }
+                                                break;
+                                            }
+                                        }
+
+                                        // Handle special cases
+                                        if (typeof content == 'object') {
+                                            if (content.raw) {
+                                                buff.push(content.raw);
+                                            }
+                                        } else {
+                                            // If we have `<%== a(function(){ %>` then we want
+                                            // `can.EJS.text(0,this, function(){ return a(function(){ var _v1ew = [];`.
+                                            buff.push(insert_cmd, "can.view.txt(" + escaped + ",'" + tagName + "'," + status() + ",this,function(){ " + (this.text.escape || '') + "return ", content,
+                                                // If we have a block.
+                                                bracketCount ?
+                                                // Start with startTxt `"var _v1ew = [];"`.
+                                                startTxt :
+                                                // If not, add `doubleParent` to close push and text.
+                                                "}));");
+                                        }
+
+                                        if (rescan && rescan.after && rescan.after.length) {
+                                            put(rescan.after.length);
+                                            rescan = null;
+                                        }
+                                        break;
+                                }
+                                startTag = null;
+                                content = '';
+                                break;
+                            case tmap.templateLeft:
+                                content += tmap.left;
+                                break;
+                            default:
+                                content += token;
+                                break;
+                        }
+                    }
+                    lastToken = token;
+                }
+
+                // Put it together...
+                if (content.length) {
+                    // Should be `content.dump` in Ruby.
+                    put(content);
+                }
+                buff.push(";");
+
+                var template = buff.join(''),
+                    out = {
+                        out: 'with(_VIEW) { with (_CONTEXT) {' + template + " " + finishTxt + "}}"
+                    };
+                // Use `eval` instead of creating a function, because it is easier to debug.
+                myEval.call(out, 'this.fn = (function(_CONTEXT,_VIEW){' + out.out + '});\r\n//@ sourceURL=' + name + ".js");
+
+                return out;
+            }
+        };
+
+        return Scanner;
+    })(__m11, __m14);
+
+    // ## can/view/node_lists.js
+    var __m17 = (function(can) {
+
+        // text node expando test
+        var canExpando = true;
+        try {
+            document.createTextNode('')._ = 0;
+        } catch (ex) {
+            canExpando = false;
+        }
+
+        // a mapping of element ids to nodeList ids
+        var nodeMap = {},
+            // a mapping of ids to text nodes
+            textNodeMap = {},
+            // a mapping of nodeList ids to nodeList
+            nodeListMap = {},
+            expando = "ejs_" + Math.random(),
+            _id = 0,
+            id = function(node) {
+                if (canExpando || node.nodeType !== 3) {
+                    if (node[expando]) {
+                        return node[expando];
+                    } else {
+                        return node[expando] = (node.nodeName ? "element_" : "obj_") + (++_id);
+                    }
+                } else {
+                    for (var textNodeID in textNodeMap) {
+                        if (textNodeMap[textNodeID] === node) {
+                            return textNodeID;
+                        }
+                    }
+
+                    textNodeMap["text_" + (++_id)] = node;
+                    return "text_" + _id;
+                }
+            },
+            // removes a nodeListId from a node's nodeListIds
+            removeNodeListId = function(node, nodeListId) {
+                var nodeListIds = nodeMap[id(node)];
+                if (nodeListIds) {
+                    var index = can.inArray(nodeListId, nodeListIds);
+
+                    if (index >= 0) {
+                        nodeListIds.splice(index, 1);
+                    }
+                    if (!nodeListIds.length) {
+                        delete nodeMap[id(node)];
+                    }
+                }
+            },
+            addNodeListId = function(node, nodeListId) {
+                var nodeListIds = nodeMap[id(node)];
+                if (!nodeListIds) {
+                    nodeListIds = nodeMap[id(node)] = [];
+                }
+                nodeListIds.push(nodeListId);
+            };
+
+        var nodeLists = {
+            id: id,
+            // replaces the contents of one node list with the nodes in another list
+            replace: function(oldNodeList, newNodes) {
+                // for each node in the node list
+                oldNodeList = can.makeArray(oldNodeList);
+
+                // try every set
+                //can.each( oldNodeList, function(node){
+                var node = oldNodeList[0]
+                // for each nodeList the node is in
+                can.each(can.makeArray(nodeMap[id(node)]), function(nodeListId) {
+
+                    // if startNode to endNode is 
+                    // within list, replace that list
+                    // I think the problem is not the WHOLE part is being 
+                    // matched
+                    var nodeList = nodeListMap[nodeListId],
+                        startIndex = can.inArray(node, nodeList),
+                        endIndex = can.inArray(oldNodeList[oldNodeList.length - 1], nodeList);
+
+
+                    // remove this nodeListId from each node
+                    if (startIndex >= 0 && endIndex >= 0) {
+                        for (var i = startIndex; i <= endIndex; i++) {
+                            var n = nodeList[i];
+                            removeNodeListId(n, nodeListId);
+                        }
+                        // swap in new nodes into the nodeLIst
+                        nodeList.splice.apply(nodeList, [startIndex, endIndex - startIndex + 1].concat(newNodes));
+
+                        // tell these new nodes they belong to the nodeList
+                        can.each(newNodes, function(node) {
+                            addNodeListId(node, nodeListId);
+                        });
+                    } else {
+                        nodeLists.unregister(nodeList);
+                    }
+                });
+                //});
+            },
+            // registers a list of nodes
+            register: function(nodeList) {
+                var nLId = id(nodeList);
+                nodeListMap[nLId] = nodeList;
+
+                can.each(nodeList, function(node) {
+                    addNodeListId(node, nLId);
+                });
+
+            },
+            // removes mappings
+            unregister: function(nodeList) {
+                var nLId = id(nodeList);
+                can.each(nodeList, function(node) {
+                    removeNodeListId(node, nLId);
+                });
+                delete nodeListMap[nLId];
+            },
+            nodeMap: nodeMap,
+            nodeListMap: nodeListMap
+        }
+        var ids = function(nodeList) {
+            return nodeList.map(function(n) {
+                return id(n) + ":" + (n.innerHTML || n.nodeValue)
+            })
+        }
+        return nodeLists;
+
+    })(__m3);
+
+    // ## can/view/live.js
+    var __m16 = (function(can, elements, view, nodeLists) {
+        // ## live.js
+        // The live module provides live binding for computes
+        // and can.Observe.List.
+        // Currently, it's API is designed for `can/view/render`, but
+        // it could easily be used for other purposes.
+
+        // ### Helper methods
+        // #### setup
+        // `setup(HTMLElement, bind(data), unbind(data)) -> data`
+        // Calls bind right away, but will call unbind
+        // if the element is "destroyed" (removed from the DOM).
+        var setup = function(el, bind, unbind) {
+            var teardown = function() {
+                unbind(data)
+                can.unbind.call(el, 'destroyed', teardown);
+            },
+                data = {
+                    teardownCheck: function(parent) {
+                        if (!parent) {
+                            teardown();
+                        }
+                    }
+                }
+
+            can.bind.call(el, 'destroyed', teardown);
+            bind(data)
+            return data;
+        },
+            // #### listen
+            // Calls setup, but presets bind and unbind to 
+            // operate on a compute
+            listen = function(el, compute, change) {
+                return setup(el, function() {
+                    compute.bind("change", change);
+                }, function(data) {
+                    compute.unbind("change", change);
+                    if (data.nodeList) {
+                        nodeLists.unregister(data.nodeList);
+                    }
+                });
+            },
+            // #### getAttributeParts
+            // Breaks up a string like foo='bar' into ["foo","'bar'""]
+            getAttributeParts = function(newVal) {
+                return (newVal || "").replace(/['"]/g, '').split('=')
+            }
+            // #### insertElementsAfter
+            // Appends elements after the last item in oldElements.
+        insertElementsAfter = function(oldElements, newFrag) {
+            var last = oldElements[oldElements.length - 1];
+
+            // Insert it in the `document` or `documentFragment`
+            if (last.nextSibling) {
+                last.parentNode.insertBefore(newFrag, last.nextSibling);
+            } else {
+                last.parentNode.appendChild(newFrag);
+            }
+        };
+
+        var live = {
+            nodeLists: nodeLists,
+            list: function(el, list, func, context, parentNode) {
+                // A mapping of the index to an array
+                // of elements that represent the item.
+                // Each array is registered so child or parent
+                // live structures can update the elements
+                var nodesMap = [],
+
+                    add = function(ev, items, index) {
+
+                        // Collect new html and mappings
+                        var frag = document.createDocumentFragment(),
+                            newMappings = [];
+                        can.each(items, function(item) {
+                            var itemHTML = func.call(context, item),
+                                itemFrag = can.view.frag(itemHTML, parentNode);
+
+                            newMappings.push(can.makeArray(itemFrag.childNodes));
+                            frag.appendChild(itemFrag);
+                        })
+
+                        // Inserting at the end of the list
+                        if (!nodesMap[index]) {
+                            insertElementsAfter(
+                                index == 0 ? [text] :
+                                nodesMap[index - 1], frag)
+                        } else {
+                            var el = nodesMap[index][0];
+                            el.parentNode.insertBefore(frag, el)
+                        }
+                        // register each item
+                        can.each(newMappings, function(nodeList) {
+                            nodeLists.register(nodeList)
+                        });
+                        [].splice.apply(nodesMap, [index, 0].concat(newMappings));
+                    },
+                    remove = function(ev, items, index) {
+                        var removedMappings = nodesMap.splice(index, items.length),
+                            itemsToRemove = [];
+
+                        can.each(removedMappings, function(nodeList) {
+                            // add items that we will remove all at once
+                            [].push.apply(itemsToRemove, nodeList)
+                            // Update any parent lists to remove these items
+                            nodeLists.replace(nodeList, []);
+                            // unregister the list
+                            nodeLists.unregister(nodeList);
+
+                        });
+                        can.remove(can.$(itemsToRemove));
+                    },
+                    parentNode = elements.getParentNode(el, parentNode),
+                    text = document.createTextNode("");
+
+                // Setup binding and teardown to add and remove events
+                setup(parentNode, function() {
+                    list.bind("add", add).bind("remove", remove)
+                }, function() {
+                    list.unbind("add", add).unbind("remove", remove);
+                    can.each(nodesMap, function(nodeList) {
+                        nodeLists.unregister(nodeList);
+                    })
+                })
+
+                insertElementsAfter([el], text);
+                can.remove(can.$(el));
+                add({}, list, 0);
+
+            },
+            html: function(el, compute, parentNode) {
+                var parentNode = elements.getParentNode(el, parentNode),
+
+                    data = listen(parentNode, compute, function(ev, newVal, oldVal) {
+                        var attached = nodes[0].parentNode;
+                        // update the nodes in the DOM with the new rendered value
+                        if (attached) {
+                            makeAndPut(newVal);
+                        }
+                        data.teardownCheck(nodes[0].parentNode);
+                    });
+
+                var nodes,
+                    makeAndPut = function(val) {
+                        // create the fragment, but don't hook it up
+                        // we need to insert it into the document first
+                        var frag = can.view.frag(val, parentNode),
+                            // keep a reference to each node
+                            newNodes = can.makeArray(frag.childNodes);
+                        // Insert it in the `document` or `documentFragment`
+                        insertElementsAfter(nodes || [el], frag)
+                        // nodes hasn't been set yet
+                        if (!nodes) {
+                            can.remove(can.$(el));
+                            nodes = newNodes;
+                            // set the teardown nodeList
+                            data.nodeList = nodes;
+                            nodeLists.register(nodes);
+                        } else {
+                            // Update node Array's to point to new nodes
+                            // and then remove the old nodes.
+                            // It has to be in this order for Mootools
+                            // and IE because somehow, after an element
+                            // is removed from the DOM, it loses its
+                            // expando values.
+                            var nodesToRemove = can.makeArray(nodes);
+                            nodeLists.replace(nodes, newNodes);
+                            can.remove(can.$(nodesToRemove));
+                        }
+                    };
+                makeAndPut(compute(), [el]);
+
+            },
+            text: function(el, compute, parentNode) {
+                var parent = elements.getParentNode(el, parentNode);
+
+                // setup listening right away so we don't have to re-calculate value
+                var data = listen(el.parentNode !== parent ? el.parentNode : parent, compute, function(ev, newVal, oldVal) {
+                    // Sometimes this is 'unknown' in IE and will throw an exception if it is
+                    if (typeof node.nodeValue != 'unknown') {
+                        node.nodeValue = "" + newVal;
+                    }
+                    data.teardownCheck(node.parentNode);
+                });
+
+                var node = document.createTextNode(compute());
+
+                if (el.parentNode !== parent) {
+                    parent = el.parentNode;
+                    parent.insertBefore(node, el);
+                    parent.removeChild(el);
+                } else {
+                    parent.insertBefore(node, el);
+                    parent.removeChild(el);
+                }
+            },
+            attributes: function(el, compute, currentValue) {
+                var setAttrs = function(newVal) {
+                    var parts = getAttributeParts(newVal),
+                        newAttrName = parts.shift();
+
+                    // Remove if we have a change and used to have an `attrName`.
+                    if ((newAttrName != attrName) && attrName) {
+                        elements.removeAttr(el, attrName);
+                    }
+                    // Set if we have a new `attrName`.
+                    if (newAttrName) {
+                        elements.setAttr(el, newAttrName, parts.join('='));
+                        attrName = newAttrName;
+                    }
+                }
+
+                listen(el, compute, function(ev, newVal) {
+                    setAttrs(newVal)
+                })
+                // current value has been set
+                if (arguments.length >= 3) {
+                    var attrName = getAttributeParts(currentValue)[0]
+                } else {
+                    setAttrs(compute())
+                }
+            },
+            attributePlaceholder: '__!!__',
+            attributeReplace: /__!!__/g,
+            attribute: function(el, attributeName, compute) {
+                listen(el, compute, function(ev, newVal) {
+                    elements.setAttr(el, attributeName, hook.render());
+                })
+
+                var wrapped = can.$(el),
+                    hooks;
+
+                // Get the list of hookups or create one for this element.
+                // Hooks is a map of attribute names to hookup `data`s.
+                // Each hookup data has:
+                // `render` - A `function` to render the value of the attribute.
+                // `funcs` - A list of hookup `function`s on that attribute.
+                // `batchNum` - The last event `batchNum`, used for performance.
+                hooks = can.data(wrapped, 'hooks');
+                if (!hooks) {
+                    can.data(wrapped, 'hooks', hooks = {});
+                }
+
+                // Get the attribute value.
+                var attr = elements.getAttr(el, attributeName),
+                    // Split the attribute value by the template.
+                    // Only split out the first __!!__ so if we have multiple hookups in the same attribute, 
+                    // they will be put in the right spot on first render
+                    parts = attr.split(live.attributePlaceholder),
+                    goodParts = [],
+                    hook;
+                goodParts.push(parts.shift(),
+                    parts.join(live.attributePlaceholder));
+
+                // If we already had a hookup for this attribute...
+                if (hooks[attributeName]) {
+                    // Just add to that attribute's list of `function`s.
+                    hooks[attributeName].computes.push(compute);
+                } else {
+                    // Create the hookup data.
+                    hooks[attributeName] = {
+                        render: function() {
+                            var i = 0,
+                                // attr doesn't have a value in IE
+                                newAttr = attr ? attr.replace(live.attributeReplace, function() {
+                                    return elements.contentText(hook.computes[i++]());
+                                }) : elements.contentText(hook.computes[i++]());
+                            return newAttr;
+                        },
+                        computes: [compute],
+                        batchNum: undefined
+                    };
+                }
+
+                // Save the hook for slightly faster performance.
+                hook = hooks[attributeName];
+
+                // Insert the value in parts.
+                goodParts.splice(1, 0, compute());
+
+                // Set the attribute.
+                elements.setAttr(el, attributeName, goodParts.join(""));
+
+            }
+        }
+        return live;
+
+    })(__m3, __m14, __m11, __m17);
+
+    // ## can/view/render.js
+    var __m15 = (function(can, elements, live) {
+
+        var pendingHookups = [],
+            tagChildren = function(tagName) {
+                var newTag = elements.tagMap[tagName] || "span";
+                if (newTag === "span") {
+                    //innerHTML in IE doesn't honor leading whitespace after empty elements
+                    return "@@!!@@";
+                }
+                return "<" + newTag + ">" + tagChildren(newTag) + "</" + newTag + ">";
+            },
+            contentText = function(input, tag) {
+
+                // If it's a string, return.
+                if (typeof input == 'string') {
+                    return input;
+                }
+                // If has no value, return an empty string.
+                if (!input && input !== 0) {
+                    return '';
+                }
+
+                // If it's an object, and it has a hookup method.
+                var hook = (input.hookup &&
+
+                    // Make a function call the hookup method.
+
+                    function(el, id) {
+                        input.hookup.call(input, el, id);
+                    }) ||
+
+                // Or if it's a `function`, just use the input.
+                (typeof input == 'function' && input);
+
+                // Finally, if there is a `function` to hookup on some dom,
+                // add it to pending hookups.
+                if (hook) {
+                    if (tag) {
+                        return "<" + tag + " " + can.view.hook(hook) + "></" + tag + ">"
+                    } else {
+                        pendingHookups.push(hook);
+                    }
+
+                    return '';
+                }
+
+                // Finally, if all else is `false`, `toString()` it.
+                return "" + input;
+            },
+            // Returns escaped/sanatized content for anything other than a live-binding
+            contentEscape = function(txt) {
+                return (typeof txt == 'string' || typeof txt == 'number') ?
+                    can.esc(txt) :
+                    contentText(txt);
+            };
+
+        var current;
+
+        can.extend(can.view, {
+                live: live,
+                setupLists: function() {
+
+                    var old = can.view.lists,
+                        data;
+
+                    can.view.lists = function(list, renderer) {
+                        data = {
+                            list: list,
+                            renderer: renderer
+                        }
+                    }
+                    return function() {
+                        can.view.lists = old;
+                        return data;
+                    }
+                },
+                pending: function() {
+                    // TODO, make this only run for the right tagName
+                    var hooks = pendingHookups.slice(0);
+                    lastHookups = hooks;
+                    pendingHookups = [];
+                    return can.view.hook(function(el) {
+                        can.each(hooks, function(fn) {
+                            fn(el);
+                        });
+                    });
+                },
+
+
+                txt: function(escape, tagName, status, self, func) {
+                    var listTeardown = can.view.setupLists(),
+                        emptyHandler = function() {},
+                        unbind = function() {
+                            compute.unbind("change", emptyHandler)
+                        };
+
+                    var compute = can.compute(func, self, false);
+                    // bind to get and temporarily cache the value
+                    compute.bind("change", emptyHandler);
+                    // call the "wrapping" function and get the binding information
+                    var tag = (elements.tagMap[tagName] || "span"),
+                        listData = listTeardown(),
+                        value = compute();
+
+
+                    if (listData) {
+                        return "<" + tag + can.view.hook(function(el, parentNode) {
+                            live.list(el, listData.list, listData.renderer, self, parentNode);
+                        }) + "></" + tag + ">";
+                    }
+
+                    // If we had no observes just return the value returned by func.
+                    if (!compute.hasDependencies) {
+                        unbind();
+                        return (escape || status !== 0 ? contentEscape : contentText)(value, status === 0 && tag);
+                    }
+
+                    // the property (instead of innerHTML elements) to adjust. For
+                    // example options should use textContent
+                    var contentProp = elements.tagToContentPropMap[tagName];
+
+
+                    // The magic tag is outside or between tags.
+                    if (status === 0 && !contentProp) {
+                        // Return an element tag with a hookup in place of the content
+                        return "<" + tag + can.view.hook(
+                            escape ?
+                            // If we are escaping, replace the parentNode with 
+                            // a text node who's value is `func`'s return value.
+
+                            function(el, parentNode) {
+                                live.text(el, compute, parentNode);
+                                unbind();
+                            } :
+                            // If we are not escaping, replace the parentNode with a
+                            // documentFragment created as with `func`'s return value.
+
+                            function(el, parentNode) {
+                                live.html(el, compute, parentNode);
+                                unbind();
+                                //children have to be properly nested HTML for buildFragment to work properly
+                            }) + ">" + tagChildren(tag) + "</" + tag + ">";
+                        // In a tag, but not in an attribute
+                    } else if (status === 1) {
+                        // remember the old attr name
+                        pendingHookups.push(function(el) {
+                            live.attributes(el, compute, compute());
+                            unbind();
+                        });
+                        return compute();
+                    } else { // In an attribute...
+                        var attributeName = status === 0 ? contentProp : status;
+                        // if the magic tag is inside the element, like `<option><% TAG %></option>`,
+                        // we add this hookup to the last element (ex: `option`'s) hookups.
+                        // Otherwise, the magic tag is in an attribute, just add to the current element's
+                        // hookups.
+                        (status === 0 ? lastHookups : pendingHookups).push(function(el) {
+                            live.attribute(el, attributeName, compute);
+                            unbind();
+                        });
+                        return live.attributePlaceholder;
+                    }
+                }
+            });
+
+        return can;
+    })(__m11, __m14, __m16, __m2);
+
+    // ## can/view/ejs/ejs.js
+    var __m12 = (function(can) {
+        // ## ejs.js
+        // `can.EJS`  
+        // _Embedded JavaScript Templates._
+
+        // Helper methods.
+        var extend = can.extend,
+            EJS = function(options) {
+                // Supports calling EJS without the constructor
+                // This returns a function that renders the template.
+                if (this.constructor != EJS) {
+                    var ejs = new EJS(options);
+                    return function(data, helpers) {
+                        return ejs.render(data, helpers);
+                    };
+                }
+                // If we get a `function` directly, it probably is coming from
+                // a `steal`-packaged view.
+                if (typeof options == "function") {
+                    this.template = {
+                        fn: options
+                    };
+                    return;
+                }
+                // Set options on self.
+                extend(this, options);
+                this.template = this.scanner.scan(this.text, this.name);
+            };
+
+        can.EJS = EJS;
+
+
+        EJS.prototype.
+
+        render = function(object, extraHelpers) {
+            object = object || {};
+            return this.template.fn.call(object, object, new EJS.Helpers(object, extraHelpers || {}));
+        };
+
+        extend(EJS.prototype, {
+
+                scanner: new can.view.Scanner({
+
+                        tokens: [
+                            ["templateLeft", "<%%"], // Template
+                            ["templateRight", "%>"], // Right Template
+                            ["returnLeft", "<%=="], // Return Unescaped
+                            ["escapeLeft", "<%="], // Return Escaped
+                            ["commentLeft", "<%#"], // Comment
+                            ["left", "<%"], // Run --- this is hack for now
+                            ["right", "%>"], // Right -> All have same FOR Mustache ...
+                            ["returnRight", "%>"]
+                        ],
+
+
+                        transform: function(source) {
+                            return source.replace(/<%([\s\S]+?)%>/gm, function(whole, part) {
+                                var brackets = [],
+                                    foundBracketPair,
+                                    i;
+
+                                // Look for brackets (for removing self-contained blocks)
+                                part.replace(/[{}]/gm, function(bracket, offset) {
+                                    brackets.push([bracket, offset]);
+                                });
+
+                                // Remove bracket pairs from the list of replacements
+                                do {
+                                    foundBracketPair = false;
+                                    for (i = brackets.length - 2; i >= 0; i--) {
+                                        if (brackets[i][0] == '{' && brackets[i + 1][0] == '}') {
+                                            brackets.splice(i, 2);
+                                            foundBracketPair = true;
+                                            break;
+                                        }
+                                    }
+                                } while (foundBracketPair);
+
+                                // Unmatched brackets found, inject EJS tags
+                                if (brackets.length >= 2) {
+                                    var result = ['<%'],
+                                        bracket,
+                                        last = 0;
+                                    for (i = 0; bracket = brackets[i]; i++) {
+                                        result.push(part.substring(last, last = bracket[1]));
+                                        if ((bracket[0] == '{' && i < brackets.length - 1) || (bracket[0] == '}' && i > 0)) {
+                                            result.push(bracket[0] == '{' ? '{ %><% ' : ' %><% }');
+                                        } else {
+                                            result.push(bracket[0]);
+                                        }
+                                        ++last;
+                                    }
+                                    result.push(part.substring(last), '%>');
+                                    return result.join('');
+                                }
+                                // Otherwise return the original
+                                else {
+                                    return '<%' + part + '%>';
+                                }
+                            });
+                        }
+                    })
+            });
+
+        EJS.Helpers = function(data, extras) {
+            this._data = data;
+            this._extras = extras;
+            extend(this, extras);
+        };
+
+
+        EJS.Helpers.prototype = {
+            // TODO Deprecated!!
+            list: function(list, cb) {
+
+                can.each(list, function(item, i) {
+                    cb(item, i, list)
+                })
+            },
+            each: function(list, cb) {
+                // Normal arrays don't get live updated
+                if (can.isArray(list)) {
+                    this.list(list, cb);
+                } else {
+                    can.view.lists(list, cb);
+                }
+            }
+        };
+
+        // Options for `steal`'s build.
+        can.view.register({
+                suffix: "ejs",
+                // returns a `function` that renders the view.
+                script: function(id, src) {
+                    return "can.EJS(function(_CONTEXT,_VIEW) { " + new EJS({
+                            text: src,
+                            name: id
+                        }).template.out + " })";
+                },
+                renderer: function(id, text) {
+                    return EJS({
+                            text: text,
+                            name: id
+                        });
+                }
+            });
+
+        return can;
+    })(__m3, __m11, __m2, __m9, __m13, __m15);
+
+    // ## can/control/control.js
+    var __m18 = (function(can) {
+        // ## control.js
+        // `can.Control`  
+        // _Controller_
+
+        // Binds an element, returns a function that unbinds.
+        var bind = function(el, ev, callback) {
+
+            can.bind.call(el, ev, callback);
+
+            return function() {
+                can.unbind.call(el, ev, callback);
+            };
+        },
+            isFunction = can.isFunction,
+            extend = can.extend,
+            each = can.each,
+            slice = [].slice,
+            paramReplacer = /\{([^\}]+)\}/g,
+            special = can.getObject("$.event.special", [can]) || {},
+
+            // Binds an element, returns a function that unbinds.
+            delegate = function(el, selector, ev, callback) {
+                can.delegate.call(el, selector, ev, callback);
+                return function() {
+                    can.undelegate.call(el, selector, ev, callback);
+                };
+            },
+
+            // Calls bind or unbind depending if there is a selector.
+            binder = function(el, ev, callback, selector) {
+                return selector ?
+                    delegate(el, can.trim(selector), ev, callback) :
+                    bind(el, ev, callback);
+            },
+
+            basicProcessor;
+
+        var Control = can.Control = can.Construct(
+
+            {
+                // Setup pre-processes which methods are event listeners.
+
+                setup: function() {
+
+                    // Allow contollers to inherit "defaults" from super-classes as it 
+                    // done in `can.Construct`
+                    can.Construct.setup.apply(this, arguments);
+
+                    // If you didn't provide a name, or are `control`, don't do anything.
+                    if (can.Control) {
+
+                        // Cache the underscored names.
+                        var control = this,
+                            funcName;
+
+                        // Calculate and cache actions.
+                        control.actions = {};
+                        for (funcName in control.prototype) {
+                            if (control._isAction(funcName)) {
+                                control.actions[funcName] = control._action(funcName);
+                            }
+                        }
+                    }
+                },
+
+                // Moves `this` to the first argument, wraps it with `jQuery` if it's an element
+                _shifter: function(context, name) {
+
+                    var method = typeof name == "string" ? context[name] : name;
+
+                    if (!isFunction(method)) {
+                        method = context[method];
+                    }
+
+                    return function() {
+                        context.called = name;
+                        return method.apply(context, [this.nodeName ? can.$(this) : this].concat(slice.call(arguments, 0)));
+                    };
+                },
+
+                // Return `true` if is an action.
+
+                _isAction: function(methodName) {
+
+                    var val = this.prototype[methodName],
+                        type = typeof val;
+                    // if not the constructor
+                    return (methodName !== 'constructor') &&
+                    // and is a function or links to a function
+                    (type == "function" || (type == "string" && isFunction(this.prototype[val]))) &&
+                    // and is in special, a processor, or has a funny character
+                    !! (special[methodName] || processors[methodName] || /[^\w]/.test(methodName));
+                },
+                // Takes a method name and the options passed to a control
+                // and tries to return the data necessary to pass to a processor
+                // (something that binds things).
+
+                _action: function(methodName, options) {
+
+                    // If we don't have options (a `control` instance), we'll run this 
+                    // later.  
+                    paramReplacer.lastIndex = 0;
+                    if (options || !paramReplacer.test(methodName)) {
+                        // If we have options, run sub to replace templates `{}` with a
+                        // value from the options or the window
+                        var convertedName = options ? can.sub(methodName, [options, window]) : methodName;
+                        if (!convertedName) {
+                            return null;
+                        }
+                        // If a `{}` template resolves to an object, `convertedName` will be
+                        // an array
+                        var arr = can.isArray(convertedName),
+
+                            // Get the name
+                            name = arr ? convertedName[1] : convertedName,
+
+                            // Grab the event off the end
+                            parts = name.split(/\s+/g),
+                            event = parts.pop();
+
+                        return {
+                            processor: processors[event] || basicProcessor,
+                            parts: [name, parts.join(" "), event],
+                            delegate: arr ? convertedName[0] : undefined
+                        };
+                    }
+                },
+                // An object of `{eventName : function}` pairs that Control uses to 
+                // hook up events auto-magically.
+
+                processors: {},
+                // A object of name-value pairs that act as default values for a 
+                // control instance
+                defaults: {}
+
+            }, {
+
+                // Sets `this.element`, saves the control in `data, binds event
+                // handlers.
+
+                setup: function(element, options) {
+
+                    var cls = this.constructor,
+                        pluginname = cls.pluginName || cls._fullName,
+                        arr;
+
+                    // Want the raw element here.
+                    this.element = can.$(element)
+
+                    if (pluginname && pluginname !== 'can_control') {
+                        // Set element and `className` on element.
+                        this.element.addClass(pluginname);
+                    }
+
+                    (arr = can.data(this.element, "controls")) || can.data(this.element, "controls", arr = []);
+                    arr.push(this);
+
+                    // Option merging.
+
+                    this.options = extend({}, cls.defaults, options);
+
+                    // Bind all event handlers.
+                    this.on();
+
+                    // Gets passed into `init`.
+
+                    return [this.element, this.options];
+                },
+
+                on: function(el, selector, eventName, func) {
+                    if (!el) {
+
+                        // Adds bindings.
+                        this.off();
+
+                        // Go through the cached list of actions and use the processor 
+                        // to bind
+                        var cls = this.constructor,
+                            bindings = this._bindings,
+                            actions = cls.actions,
+                            element = this.element,
+                            destroyCB = can.Control._shifter(this, "destroy"),
+                            funcName, ready;
+
+                        for (funcName in actions) {
+                            // Only push if we have the action and no option is `undefined`
+                            if (actions.hasOwnProperty(funcName) &&
+                                (ready = actions[funcName] || cls._action(funcName, this.options))) {
+                                bindings.push(ready.processor(ready.delegate || element,
+                                        ready.parts[2], ready.parts[1], funcName, this));
+                            }
+                        }
+
+
+                        // Setup to be destroyed...  
+                        // don't bind because we don't want to remove it.
+                        can.bind.call(element, "destroyed", destroyCB);
+                        bindings.push(function(el) {
+                            can.unbind.call(el, "destroyed", destroyCB);
+                        });
+                        return bindings.length;
+                    }
+
+                    if (typeof el == 'string') {
+                        func = eventName;
+                        eventName = selector;
+                        selector = el;
+                        el = this.element;
+                    }
+
+                    if (func === undefined) {
+                        func = eventName;
+                        eventName = selector;
+                        selector = null;
+                    }
+
+                    if (typeof func == 'string') {
+                        func = can.Control._shifter(this, func);
+                    }
+
+                    this._bindings.push(binder(el, eventName, func, selector));
+
+                    return this._bindings.length;
+                },
+                // Unbinds all event handlers on the controller.
+
+                off: function() {
+                    var el = this.element[0]
+                    each(this._bindings || [], function(value) {
+                        value(el);
+                    });
+                    // Adds bindings.
+                    this._bindings = [];
+                },
+                // Prepares a `control` for garbage collection
+
+                destroy: function() {
+                    //Control already destroyed
+                    if (this.element === null) {
+
+                        return;
+                    }
+                    var Class = this.constructor,
+                        pluginName = Class.pluginName || Class._fullName,
+                        controls;
+
+                    // Unbind bindings.
+                    this.off();
+
+                    if (pluginName && pluginName !== 'can_control') {
+                        // Remove the `className`.
+                        this.element.removeClass(pluginName);
+                    }
+
+                    // Remove from `data`.
+                    controls = can.data(this.element, "controls");
+                    controls.splice(can.inArray(this, controls), 1);
+
+                    can.trigger(this, "destroyed"); // In case we want to know if the `control` is removed.
+
+                    this.element = null;
+                }
+            });
+
+        var processors = can.Control.processors,
+            // Processors do the binding.
+            // They return a function that unbinds when called.  
+            // The basic processor that binds events.
+            basicProcessor = function(el, event, selector, methodName, control) {
+                return binder(el, event, can.Control._shifter(control, methodName), selector);
+            };
+
+        // Set common events to be processed as a `basicProcessor`
+        each(["change", "click", "contextmenu", "dblclick", "keydown", "keyup",
+                "keypress", "mousedown", "mousemove", "mouseout", "mouseover",
+                "mouseup", "reset", "resize", "scroll", "select", "submit", "focusin",
+                "focusout", "mouseenter", "mouseleave",
+                // #104 - Add touch events as default processors
+                // TOOD feature detect?
+                "touchstart", "touchmove", "touchcancel", "touchend", "touchleave"
+            ], function(v) {
+                processors[v] = basicProcessor;
+            });
+
+        return Control;
+    })(__m3, __m1);
+
+    // ## can/util/string/deparam/deparam.js
+    var __m20 = (function(can) {
+
+        // ## deparam.js  
+        // `can.deparam`  
+        // _Takes a string of name value pairs and returns a Object literal that represents those params._
+        var digitTest = /^\d+$/,
+            keyBreaker = /([^\[\]]+)|(\[\])/g,
+            paramTest = /([^?#]*)(#.*)?$/,
+            prep = function(str) {
+                return decodeURIComponent(str.replace(/\+/g, " "));
+            };
+
+
+        can.extend(can, {
+
+                deparam: function(params) {
+
+                    var data = {},
+                        pairs, lastPart;
+
+                    if (params && paramTest.test(params)) {
+
+                        pairs = params.split('&'),
+
+                        can.each(pairs, function(pair) {
+
+                            var parts = pair.split('='),
+                                key = prep(parts.shift()),
+                                value = prep(parts.join("=")),
+                                current = data;
+
+                            if (key) {
+                                parts = key.match(keyBreaker);
+
+                                for (var j = 0, l = parts.length - 1; j < l; j++) {
+                                    if (!current[parts[j]]) {
+                                        // If what we are pointing to looks like an `array`
+                                        current[parts[j]] = digitTest.test(parts[j + 1]) || parts[j + 1] == "[]" ? [] : {};
+                                    }
+                                    current = current[parts[j]];
+                                }
+                                lastPart = parts.pop();
+                                if (lastPart == "[]") {
+                                    current.push(value);
+                                } else {
+                                    current[lastPart] = value;
+                                }
+                            }
+                        });
+                    }
+                    return data;
+                }
+            });
+        return can;
+    })(__m3, __m2);
+
+    // ## can/route/route.js
+    var __m19 = (function(can) {
+
+        // ## route.js  
+        // `can.route`  
+        // _Helps manage browser history (and client state) by synchronizing the 
+        // `window.location.hash` with a `can.Observe`._  
+        // Helper methods used for matching routes.
+        var
+        // `RegExp` used to match route variables of the type ':name'.
+        // Any word character or a period is matched.
+        matcher = /\:([\w\.]+)/g,
+            // Regular expression for identifying &amp;key=value lists.
+            paramsMatcher = /^(?:&[^=]+=[^&]*)+/,
+            // Converts a JS Object into a list of parameters that can be 
+            // inserted into an html element tag.
+            makeProps = function(props) {
+                var tags = [];
+                can.each(props, function(val, name) {
+                    tags.push((name === 'className' ? 'class' : name) + '="' +
+                        (name === "href" ? val : can.esc(val)) + '"');
+                });
+                return tags.join(" ");
+            },
+            // Checks if a route matches the data provided. If any route variable
+            // is not present in the data, the route does not match. If all route
+            // variables are present in the data, the number of matches is returned 
+            // to allow discerning between general and more specific routes. 
+            matchesData = function(route, data) {
+                var count = 0,
+                    i = 0,
+                    defaults = {};
+                // look at default values, if they match ...
+                for (var name in route.defaults) {
+                    if (route.defaults[name] === data[name]) {
+                        // mark as matched
+                        defaults[name] = 1;
+                        count++;
+                    }
+                }
+                for (; i < route.names.length; i++) {
+                    if (!data.hasOwnProperty(route.names[i])) {
+                        return -1;
+                    }
+                    if (!defaults[route.names[i]]) {
+                        count++;
+                    }
+
+                }
+
+                return count;
+            },
+            onready = !0,
+            location = window.location,
+            wrapQuote = function(str) {
+                return (str + '').replace(/([.?*+\^$\[\]\\(){}|\-])/g, "\\$1");
+            },
+            each = can.each,
+            extend = can.extend;
+
+        can.route = function(url, defaults) {
+            defaults = defaults || {};
+            // Extract the variable names and replace with `RegExp` that will match
+            // an atual URL with values.
+            var names = [],
+                test = url.replace(matcher, function(whole, name, i) {
+                    names.push(name);
+                    var next = "\\" + (url.substr(i + whole.length, 1) || can.route._querySeparator);
+                    // a name without a default value HAS to have a value
+                    // a name that has a default value can be empty
+                    // The `\\` is for string-escaping giving single `\` for `RegExp` escaping.
+                    return "([^" + next + "]" + (defaults[name] ? "*" : "+") + ")";
+                });
+
+            // Add route in a form that can be easily figured out.
+            can.route.routes[url] = {
+                // A regular expression that will match the route when variable values 
+                // are present; i.e. for `:page/:type` the `RegExp` is `/([\w\.]*)/([\w\.]*)/` which
+                // will match for any value of `:page` and `:type` (word chars or period).
+                test: new RegExp("^" + test + "($|" + wrapQuote(can.route._querySeparator) + ")"),
+                // The original URL, same as the index for this entry in routes.
+                route: url,
+                // An `array` of all the variable names in this route.
+                names: names,
+                // Default values provided for the variables.
+                defaults: defaults,
+                // The number of parts in the URL separated by `/`.
+                length: url.split('/').length
+            };
+            return can.route;
+        };
+
+
+        extend(can.route, {
+
+                _querySeparator: '&',
+                _paramsMatcher: paramsMatcher,
+
+
+                param: function(data, _setRoute) {
+                    // Check if the provided data keys match the names in any routes;
+                    // Get the one with the most matches.
+                    var route,
+                        // Need to have at least 1 match.
+                        matches = 0,
+                        matchCount,
+                        routeName = data.route,
+                        propCount = 0;
+
+                    delete data.route;
+
+                    each(data, function() {
+                        propCount++;
+                    });
+                    // Otherwise find route.
+                    each(can.route.routes, function(temp, name) {
+                        // best route is the first with all defaults matching
+
+
+                        matchCount = matchesData(temp, data);
+                        if (matchCount > matches) {
+                            route = temp;
+                            matches = matchCount;
+                        }
+                        if (matchCount >= propCount) {
+                            return false;
+                        }
+                    });
+                    // If we have a route name in our `can.route` data, and it's
+                    // just as good as what currently matches, use that
+                    if (can.route.routes[routeName] && matchesData(can.route.routes[routeName], data) === matches) {
+                        route = can.route.routes[routeName];
+                    }
+                    // If this is match...
+                    if (route) {
+                        var cpy = extend({}, data),
+                            // Create the url by replacing the var names with the provided data.
+                            // If the default value is found an empty string is inserted.
+                            res = route.route.replace(matcher, function(whole, name) {
+                                delete cpy[name];
+                                return data[name] === route.defaults[name] ? "" : encodeURIComponent(data[name]);
+                            }),
+                            after;
+                        // Remove matching default values
+                        each(route.defaults, function(val, name) {
+                            if (cpy[name] === val) {
+                                delete cpy[name];
+                            }
+                        });
+
+                        // The remaining elements of data are added as 
+                        // `&amp;` separated parameters to the url.
+                        after = can.param(cpy);
+                        // if we are paraming for setting the hash
+                        // we also want to make sure the route value is updated
+                        if (_setRoute) {
+                            can.route.attr('route', route.route);
+                        }
+                        return res + (after ? can.route._querySeparator + after : "");
+                    }
+                    // If no route was found, there is no hash URL, only paramters.
+                    return can.isEmptyObject(data) ? "" : can.route._querySeparator + can.param(data);
+                },
+
+                deparam: function(url) {
+                    // See if the url matches any routes by testing it against the `route.test` `RegExp`.
+                    // By comparing the URL length the most specialized route that matches is used.
+                    var route = {
+                        length: -1
+                    };
+                    each(can.route.routes, function(temp, name) {
+                        if (temp.test.test(url) && temp.length > route.length) {
+                            route = temp;
+                        }
+                    });
+                    // If a route was matched.
+                    if (route.length > -1) {
+
+                        var // Since `RegExp` backreferences are used in `route.test` (parens)
+                        // the parts will contain the full matched string and each variable (back-referenced) value.
+                        parts = url.match(route.test),
+                            // Start will contain the full matched string; parts contain the variable values.
+                            start = parts.shift(),
+                            // The remainder will be the `&amp;key=value` list at the end of the URL.
+                            remainder = url.substr(start.length - (parts[parts.length - 1] === can.route._querySeparator ? 1 : 0)),
+                            // If there is a remainder and it contains a `&amp;key=value` list deparam it.
+                            obj = (remainder && can.route._paramsMatcher.test(remainder)) ? can.deparam(remainder.slice(1)) : {};
+
+                        // Add the default values for this route.
+                        obj = extend(true, {}, route.defaults, obj);
+                        // Overwrite each of the default values in `obj` with those in 
+                        // parts if that part is not empty.
+                        each(parts, function(part, i) {
+                            if (part && part !== can.route._querySeparator) {
+                                obj[route.names[i]] = decodeURIComponent(part);
+                            }
+                        });
+                        obj.route = route.route;
+                        return obj;
+                    }
+                    // If no route was matched, it is parsed as a `&amp;key=value` list.
+                    if (url.charAt(0) !== can.route._querySeparator) {
+                        url = can.route._querySeparator + url;
+                    }
+                    return can.route._paramsMatcher.test(url) ? can.deparam(url.slice(1)) : {};
+                },
+
+                data: new can.Observe({}),
+
+                routes: {},
+
+                ready: function(val) {
+                    if (val === false) {
+                        onready = val;
+                    }
+                    if (val === true || onready === true) {
+                        can.route._setup();
+                        setState();
+                    }
+                    return can.route;
+                },
+
+                url: function(options, merge) {
+                    if (merge) {
+                        options = extend({}, curParams, options)
+                    }
+                    return "#!" + can.route.param(options);
+                },
+
+                link: function(name, options, props, merge) {
+                    return "<a " + makeProps(
+                        extend({
+                                href: can.route.url(options, merge)
+                            }, props)) + ">" + name + "</a>";
+                },
+
+                current: function(options) {
+                    return location.hash == "#!" + can.route.param(options)
+                },
+                _setup: function() {
+                    // If the hash changes, update the `can.route.data`.
+                    can.bind.call(window, 'hashchange', setState);
+                },
+                _getHash: function() {
+                    return location.href.split(/#!?/)[1] || "";
+                },
+                _setHash: function(serialized) {
+                    var path = (can.route.param(serialized, true));
+                    location.hash = "#!" + path;
+                    return path;
+                }
+            });
+
+
+        // The functions in the following list applied to `can.route` (e.g. `can.route.attr('...')`) will
+        // instead act on the `can.route.data` observe.
+        each(['bind', 'unbind', 'delegate', 'undelegate', 'attr', 'removeAttr'], function(name) {
+            can.route[name] = function() {
+                // `delegate` and `undelegate` require
+                // the `can/observe/delegate` plugin
+                if (!can.route.data[name]) {
+                    return;
+                }
+
+                return can.route.data[name].apply(can.route.data, arguments);
+            }
+        })
+
+        var // A ~~throttled~~ debounced function called multiple times will only fire once the
+        // timer runs down. Each call resets the timer.
+        timer,
+            // Intermediate storage for `can.route.data`.
+            curParams,
+            // Deparameterizes the portion of the hash of interest and assign the
+            // values to the `can.route.data` removing existing values no longer in the hash.
+            // setState is called typically by hashchange which fires asynchronously
+            // So it's possible that someone started changing the data before the 
+            // hashchange event fired.  For this reason, it will not set the route data
+            // if the data is changing or the hash already matches the hash that was set.
+            setState = can.route.setState = function() {
+                var hash = can.route._getHash();
+                curParams = can.route.deparam(hash);
+
+                // if the hash data is currently changing, or
+                // the hash is what we set it to anyway, do NOT change the hash
+                if (!changingData || hash !== lastHash) {
+                    can.route.attr(curParams, true);
+                }
+            },
+            // The last hash caused by a data change
+            lastHash,
+            // Are data changes pending that haven't yet updated the hash
+            changingData;
+
+        // If the `can.route.data` changes, update the hash.
+        // Using `.serialize()` retrieves the raw data contained in the `observable`.
+        // This function is ~~throttled~~ debounced so it only updates once even if multiple values changed.
+        // This might be able to use batchNum and avoid this.
+        can.route.bind("change", function(ev, attr) {
+            // indicate that data is changing
+            changingData = 1;
+            clearTimeout(timer);
+            timer = setTimeout(function() {
+                // indicate that the hash is set to look like the data
+                changingData = 0;
+                var serialized = can.route.data.serialize();
+
+                lastHash = can.route._setHash(serialized);
+            }, 1);
+        });
+        // `onready` event...
+        can.bind.call(document, "ready", can.route.ready);
+
+        // Libraries other than jQuery don't execute the document `ready` listener
+        // if we are already DOM ready
+        if ((document.readyState === 'complete' || document.readyState === "interactive") && onready) {
+            can.route.ready();
+        }
+
+        // extend route to have a similar property 
+        // that is often checked in mustache to determine
+        // an object's observability
+        can.route.constructor.canMakeObserve = can.Observe.canMakeObserve;
+
+        return can.route;
+    })(__m3, __m7, __m20);
+
+    // ## can/control/route/route.js
+    var __m21 = (function(can) {
+
+        // ## control/route.js  
+        // _Controller route integration._
+
+        can.Control.processors.route = function(el, event, selector, funcName, controller) {
+            selector = selector || "";
+            can.route(selector);
+            var batchNum,
+                check = function(ev, attr, how) {
+                    if (can.route.attr('route') === (selector) &&
+                        (ev.batchNum === undefined || ev.batchNum !== batchNum)) {
+
+                        batchNum = ev.batchNum;
+
+                        var d = can.route.attr();
+                        delete d.route;
+                        if (can.isFunction(controller[funcName])) {
+                            controller[funcName](d);
+                        } else {
+                            controller[controller[funcName]](d);
+                        }
+
+                    }
+                };
+            can.route.bind('change', check);
+            return function() {
+                can.route.unbind('change', check);
+            };
+        };
+
+        return can;
+    })(__m3, __m19, __m18);
+
+    // ## can/util/object/object.js
+    var __m23 = (function(can) {
+
+        var isArray = can.isArray,
+            // essentially returns an object that has all the must have comparisons ...
+            // must haves, do not return true when provided undefined
+            cleanSet = function(obj, compares) {
+                var copy = can.extend({}, obj);
+                for (var prop in copy) {
+                    var compare = compares[prop] === undefined ? compares["*"] : compares[prop];
+                    if (same(copy[prop], undefined, compare)) {
+                        delete copy[prop]
+                    }
+                }
+                return copy;
+            },
+            propCount = function(obj) {
+                var count = 0;
+                for (var prop in obj) count++;
+                return count;
+            };
+
+        can.Object = {};
+
+        var same = can.Object.same = function(a, b, compares, aParent, bParent, deep) {
+            var aType = typeof a,
+                aArray = isArray(a),
+                comparesType = typeof compares,
+                compare;
+
+            if (comparesType == 'string' || compares === null) {
+                compares = compareMethods[compares];
+                comparesType = 'function'
+            }
+            if (comparesType == 'function') {
+                return compares(a, b, aParent, bParent)
+            }
+            compares = compares || {};
+
+            if (a instanceof Date) {
+                return a === b;
+            }
+            if (deep === -1) {
+                return aType === 'object' || a === b;
+            }
+            if (aType !== typeof b || aArray !== isArray(b)) {
+                return false;
+            }
+            if (a === b) {
+                return true;
+            }
+            if (aArray) {
+                if (a.length !== b.length) {
+                    return false;
+                }
+                for (var i = 0; i < a.length; i++) {
+                    compare = compares[i] === undefined ? compares["*"] : compares[i]
+                    if (!same(a[i], b[i], a, b, compare)) {
+                        return false;
+                    }
+                };
+                return true;
+            } else if (aType === "object" || aType === 'function') {
+                var bCopy = can.extend({}, b);
+                for (var prop in a) {
+                    compare = compares[prop] === undefined ? compares["*"] : compares[prop];
+                    if (!same(a[prop], b[prop], compare, a, b, deep === false ? -1 : undefined)) {
+                        return false;
+                    }
+                    delete bCopy[prop];
+                }
+                // go through bCopy props ... if there is no compare .. return false
+                for (prop in bCopy) {
+                    if (compares[prop] === undefined || !same(undefined, b[prop], compares[prop], a, b, deep === false ? -1 : undefined)) {
+                        return false;
+                    }
+                }
+                return true;
+            }
+            return false;
+        };
+
+        can.Object.subsets = function(checkSet, sets, compares) {
+            var len = sets.length,
+                subsets = [],
+                checkPropCount = propCount(checkSet),
+                setLength;
+
+            for (var i = 0; i < len; i++) {
+                //check this subset
+                var set = sets[i];
+                if (can.Object.subset(checkSet, set, compares)) {
+                    subsets.push(set)
+                }
+            }
+            return subsets;
+        };
+
+        can.Object.subset = function(subset, set, compares) {
+            // go through set {type: 'folder'} and make sure every property
+            // is in subset {type: 'folder', parentId :5}
+            // then make sure that set has fewer properties
+            // make sure we are only checking 'important' properties
+            // in subset (ones that have to have a value)
+
+            var setPropCount = 0,
+                compares = compares || {};
+
+            for (var prop in set) {
+
+                if (!same(subset[prop], set[prop], compares[prop], subset, set)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        var compareMethods = {
+            "null": function() {
+                return true;
+            },
+            i: function(a, b) {
+                return ("" + a).toLowerCase() == ("" + b).toLowerCase()
+            }
+        }
+
+        return can.Object;
+
+    })(__m3);
+
+    // ## can/observe/backup/backup.js
+    var __m22 = (function(can) {
+        var flatProps = function(a) {
+            var obj = {};
+            for (var prop in a) {
+                if (typeof a[prop] !== 'object' || a[prop] === null || a[prop] instanceof Date) {
+                    obj[prop] = a[prop]
+                }
+            }
+            return obj;
+        };
+
+        can.extend(can.Observe.prototype, {
+
+
+                backup: function() {
+                    this._backupStore = this._attrs();
+                    return this;
+                },
+
+
+                isDirty: function(checkAssociations) {
+                    return this._backupStore && !can.Object.same(this._attrs(),
+                        this._backupStore,
+                        undefined,
+                        undefined,
+                        undefined, !! checkAssociations);
+                },
+
+
+                restore: function(restoreAssociations) {
+                    var props = restoreAssociations ? this._backupStore : flatProps(this._backupStore)
+
+                    if (this.isDirty(restoreAssociations)) {
+                        this._attrs(props);
+                    }
+
+                    return this;
+                }
+
+            })
+
+        return can.Observe;
+    })(__m3, __m7, __m23);
+
+    window['can'] = __m5;
+})();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/d/about.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,34 @@
+
+// Animate the background image.
+//
+var set_frame = function( frame ) {
+	var frames = 8;
+	var speed  = 100;
+	var next   = frame + 1;
+	var body   = $( 'body' );
+
+	if ( next > frames + 1 ) return;
+	body.css({ backgroundImage: "url(app://img/about/" + frame + ".jpg)" });
+	D.delay( function(){ set_frame( next ) }, speed );
+};
+
+
+$( window ).ready( function() {
+	$( '#name' ).html( D.name );
+	$( '#version' ).html( D.version );
+	$( '#tide-version' ).html( D.ti_version );
+	$( '#platform' ).html( D.platform );
+	$( '#arch' ).html( D.architecture );
+
+	$( 'body' ).bind( 'click', function() { Ti.UI.currentWindow.close(); });
+
+	// preload animation images to prevent flicker.
+	for ( var i = 1; i < 9; i++ ) {
+		var img = new Image( 600,432 );
+		img.src = "app://img/about/" + i + ".jpg"; 
+	}
+
+	D.delay( function(){ set_frame( 1 ) }, 5000 );
+});
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/d/dascyllus.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,256 @@
+
+/*######################################################################
+### D A S C Y L L U S   N A M E S P A C E
+######################################################################*/
+var D = {
+
+	// Versions
+	platform:     Ti.getPlatform(),
+	name:         Ti.API.Application.getName(),
+	version:      Ti.API.Application.getVersion(),
+	ti_version:   Ti.getVersion(),
+	architecture: Ti.Platform.getArchitecture(),
+
+	// Declared windows, for easy referencing
+	window: {},
+
+	// Very first run of Dasycllus?
+	firstrun: false,
+
+	// Persistent storage DB handle.
+	db: null,
+
+	// The current TF server we'll be connected to;
+	//     uri: http://localhost:8080/
+	//     version: Thingfish 0.5.0 (build ...)
+	//
+	tf: null,
+
+
+	// Open a handle to the local database, initializing it
+	// if necessary and performing rudamentary upwards migrations.
+	//
+	initDB: function() {
+		this.db = Ti.Database.openFile(
+			Ti.Filesystem.getFile(
+				Ti.Filesystem.getApplicationDataDirectory(), 'dascyllus.db'
+			)
+		);
+
+		var rv = this.db.execute( 'PRAGMA user_version' );
+		var schema_version = parseInt( rv.fieldByName('user_version') );
+
+		var schemas_dir = Ti.Filesystem.getFile(
+				Ti.Filesystem.getApplicationDirectory(), 'sql' );
+		var current_version = schemas_dir.getDirectoryListing().length;
+
+		if ( schema_version == 0 ) {
+			this.notify( 'Welcome!', 'Dascyllus defaults installed.' );
+			this.firstrun = true;
+		}
+
+		if ( schema_version != current_version ) {
+			console.log( 'Dascyllus DB at version ' + schema_version +
+					', needs to be upgraded to ' + current_version + '.' );
+
+			while ( schema_version != current_version ) {
+				var update_version = schema_version + 1;
+				console.log( '  updating to version ' + update_version );
+
+				var line;
+				var schema_file = Ti.Filesystem.getFileStream(
+						Ti.Filesystem.getApplicationDirectory(), 'sql', update_version + '.sql' );
+				schema_file.open();
+
+				this.db.execute( 'BEGIN' );
+				while ( line = schema_file.readLine() ) this.db.execute( line.toString() );
+
+				this.db.execute( 'PRAGMA user_version = ' + update_version  );
+				this.db.execute( 'COMMIT' );
+
+				schema_version = update_version;
+				schema_file.close();
+			}
+		}
+
+		return this.db;
+	},
+
+
+	// Return a preference's current value, or null if nonexistent.
+	//
+	getPref: function( pref ) {
+		var row = this.db.execute( "SELECT val FROM prefs WHERE key=?", pref );
+		if ( ! row.isValidRow() ) return null;
+
+		var value = row.fieldByName( 'val' );
+		row.close();
+
+		return value;
+	},
+
+
+	// Return a preference's current value as a boolean.
+	//
+	getBoolPref: function( pref ) {
+		return this.getPref( pref ) == '1'
+	},
+
+
+	// Insert or update a preference value.
+	//
+	setPref: function( pref, value ) {
+		this.db.execute( 'BEGIN' );
+
+		// Row already exists, remove it first.
+		if ( this.getPref( pref ) != null )
+			this.db.execute( 'DELETE FROM prefs WHERE key=?', pref );
+
+		this.db.execute( 'INSERT INTO prefs VALUES ( ?, ? )', pref, value );
+		this.db.execute( 'COMMIT' );
+	},
+
+
+	// Set a bool preference value.
+	//
+	setBoolPref: function( pref, value ) {
+		this.setPref( pref, (value ? '1' : '0') );
+	},
+
+
+	// Generic delayed callback that returns the timer handle.
+	//
+	delay: (function() {
+		var timer = null;
+		return function( callback, ms, clear_previous ) {
+			if ( clear_previous) clearTimeout( timer );
+			timer = setTimeout( callback, ms );
+			return timer;
+		};
+	})(),
+
+
+	// Create and show a new notification.
+	//
+	notify: function( title, message, callback ) {
+		if ( ! callback ) callback = function(){};
+
+		var notification = Ti.Notification.createNotification({
+			'title' : title,
+			'message' : message,
+			'timeout' : 10,
+			'callback' : callback,
+		});
+
+		notification.show();
+		return notification;
+	},
+
+
+	// Attempt a connection to a remote Thingfish server, and
+	// populate the D.tf variable.
+	//
+	checkServer: function( uri ) {
+		this.tf = null;
+
+		var serverOk = function( data, status, xhr ) {
+			var info = xhr.getResponseHeader( 'x-thingfish' );
+			if ( info ) {
+				D.tf = {
+					uri: uri,
+					version: data.version
+				};
+				D.notify( 'Connected.', info );
+			}
+			else {
+				D.notify( 'Unable to connect.', 'Not a Thingfish server?' );
+			}
+		};
+
+		$.ajax({
+			url:      uri,
+			sync:     false,
+			success:  serverOk,
+			error:    function( xhr, status, err ) {
+				D.notify( 'Unable to connect.', err );
+			},
+			dataType: 'json'
+		});
+	},
+
+
+	// Build the main menu.
+	//
+	setupMenu: function() {
+		var menu  = Ti.UI.createMenu();
+		var yep   = Ti.UI.createMenuItem( 'Yep' );
+
+		yep.addItem( 'About', function() {
+			if ( D.window.about && D.window.about.isVisible() ) {
+				D.window.about.focus();
+			}
+			else {
+				D.window.about = D.window.main.createWindow( 'app://window/about.html' );
+				D.window.about.setTopMost( true );
+				D.window.about.open();
+			}
+		});
+
+		yep.addItem( 'Preferences', function() {
+			if ( D.window.prefs && D.window.prefs.isVisible() ) {
+				D.window.prefs.focus();
+			}
+			else {
+				D.window.prefs = D.window.main.createWindow( 'app://window/prefs.html' );
+				D.window.prefs.open();
+			}
+		});
+
+		yep.addItem( 'Toggle Full Screen', function() {
+			D.window.main.setFullscreen( ! D.window.main.isFullscreen() );
+		});
+
+		menu.appendItem( yep );
+		Ti.UI.setMenu( menu );
+	},
+
+
+	/*######################################################################
+	### M O D E L S
+	######################################################################*/
+
+	// A Thingfish asset.
+	//
+	initModel: function() {
+		D.Asset = can.Model({
+			id     : 'oid',
+			findAll: 'GET '    + D.tf.uri + '/',
+			findOne: 'GET '    + D.tf.uri + '/{oid}',
+			create : 'POST '   + D.tf.uri + '/',
+			update : 'PUT '    + D.tf.uri + '/{oid}',
+			destroy: 'DELETE ' + D.tf.uri + '/{oid}',
+
+			// TODO: other metadata hooks?  diff model?
+			metadata: 'GET ' + D.tf.uri + '/{oid}/metadata',
+
+		}, {}).
+			bind( 'created', function( ev, asset ) {
+				console.debug( "Created a new asset " + asset.id );
+			}).
+			bind( 'updated', function( ev, asset ) {
+				console.debug( "Updated asset " + asset.id );
+			}).
+			bind( 'destroyed', function( ev, asset ) {
+				console.debug( "Removed asset " + asset.id );
+			}
+		);
+	},
+};
+
+
+// Initialization.
+//
+D.window.main = Ti.UI.getMainWindow();
+D.setupMenu();
+D.initDB();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/d/main.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,43 @@
+
+$( window ).ready( function() {
+	if ( D.getBoolPref('fullscreen') ) D.window.main.setFullscreen( true );
+
+	// If we're in development mode, just display the main window,
+	// the inpector, and stop here.
+	//
+	if ( D.getBoolPref('devmode') ) {
+		D.window.main.showInspector( true );
+		return;
+	}
+
+	// "Regular" behavior.  Hide the main window, show splash.
+	//
+	if ( ! D.getBoolPref('hidesplash') ) {
+		D.window.main.hide();
+		D.window.splash = D.window.main.createWindow( 'app://window/splash.html' );
+		D.window.splash.setTopMost( true );
+		D.window.splash.open();
+	}
+
+	var server_uri = D.getPref( 'server_uri' );
+	if ( server_uri ) D.checkServer( server_uri );
+
+
+	// Show the main window after a few moments.
+	//
+	D.delay(function() {
+		if ( ! D.getBoolPref('hidesplash') ) {
+			D.window.main.show();
+			D.window.splash.close();
+		}
+
+		// Throw up the prefs window if this is the first time.
+		//
+		if ( D.firstrun ) {
+			D.window.prefs = D.window.main.createWindow( 'app://window/prefs.html#server' );
+			D.window.prefs.open();
+			D.notify( 'Initial setup', 'Please point me to a Thingfish server!' );
+		}
+	}, 3000 );
+});
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/d/prefs.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,141 @@
+
+$( window ).ready( function() {
+	new PrefsRouter( $('#content') );
+});
+
+
+/* ---------------------------------------------- */
+/* Router for the various Pref sections */
+/* ---------------------------------------------- */
+PrefsRouter = can.Control({
+	defaults: {
+		menu: $( '#sections' ),
+		default_route: 'app'
+	}
+}, {
+	init: function() {
+		var self = this;
+		self.controls = [];
+
+		if ( window.location.hash == "" ) window.location.hash = "#" + self.options.default_route;
+	},
+
+	// Remove controllers (and their children DOM elements) and reflect
+	// the currently selected route.
+	//
+	reset: function() {
+		var self = this;
+		var current_route = can.route.attr( 'route' );
+		var menu = self.options.menu;
+
+		// FIXME
+		menu.find( 'a' ).removeClass( 'selected' );
+		console.log( menu.find( 'a' ) );
+		console.log( menu.find( 'a[href="#' + current_route + '"]' ) );
+
+		while ( control = self.controls.pop() ) control.destroy();
+	},
+
+	"app route": function() {
+		this.reset();
+		this.controls.push( new PrefsAppWidget(this.element) );
+	},
+
+	"server route": function() {
+		this.reset();
+		this.controls.push( new PrefsServerWidget(this.element) );
+	},
+});
+
+
+/* ---------------------------------------------- */
+/* App behavior section */
+/* ---------------------------------------------- */
+PrefsAppWidget = can.Control({
+	defaults: {
+		view: 'app://window/prefs/app.ejs'
+	}
+}, {
+	init: function() {
+		var self = this;
+
+		// Get the current preference values.
+		//
+		var bool_prefs = {
+			hidesplash: [ D.getBoolPref( 'hidesplash' ), 'Skip splash screen at startup' ],
+			fullscreen: [ D.getBoolPref( 'fullscreen' ), 'Go full screen by default' ],
+			devmode:    [ D.getBoolPref( 'devmode' ), 'Developer mode' ]
+		}
+
+		self.element.html(
+			can.view( self.options.view, {
+				bool_prefs: bool_prefs
+			})
+		);
+	},
+
+	'input click': function( ele, event ) {
+		var pref = ele.data( 'field' );
+
+		if ( ele.attr('type') == 'checkbox' ) {
+			var bool = ele.is( ':checked' );
+			D.setBoolPref( pref, ele.is(':checked') );
+
+			if ( pref == 'devmode' && bool ) D.window.main.showInspector( true );
+		}
+	},
+});
+
+
+/* ---------------------------------------------- */
+/* Server section */
+/* ---------------------------------------------- */
+PrefsServerWidget = can.Control({
+	defaults: {
+		view: 'app://window/prefs/servers.ejs'
+	}
+}, {
+	init: function() {
+		var self = this;
+		var server = D.getPref( 'server_uri' );
+
+		self.element.html(
+			can.view( self.options.view, {
+				server: server
+			})
+		);
+	},
+
+	// Update the server URI preference.
+	//
+	updateServer: function( uri ) {
+		console.log( 'Updated server_uri to ' + uri + '.' );
+		D.setPref( 'server_uri', uri );
+		D.tf.uri = uri;
+	},
+
+	// Hitting the return key on input fields defer to the 'blur' event,
+	// which in turn fires the 'change' event.
+	//
+	"#server keypress": function( ele, event ) {
+		if ( event.which == 13 ) ele.trigger( 'blur' );
+	},
+	'#server change': function( ele, event ) {
+		this.updateServer( ele.val() );
+	},
+	'#server keyup': function( ele, event ) {
+		D.delay( function() {
+			this.updateServer( ele.val() );
+		}, 500, true );
+	},
+
+
+	// Talk to the remote server, check to see if it's really
+	// a ThingFish handler or not.
+	//
+	'#test click': function( ele, event ) {
+		var server = $( '#server' ).val();
+		D.checkServer( server );
+	},
+});
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/d/splash.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,30 @@
+
+$( window ).ready( function() {
+	$( '#name' ).html( D.name );
+
+	/*
+	var win = $( window );
+	splash = Ti.UI.currentWindow;
+
+	var dragging = false;
+	var xstart   = 0;
+	var ystart   = 0;
+
+	win.bind( 'mousemove', function( event ) {
+		if ( ! dragging ) return;
+		splash.setX( splash.getX() + event.clientX - xstart );
+		splash.setY( splash.getY() + event.clientY - ystart );
+	});
+
+	win.bind( 'mousedown', function( event ) {
+		dragging = true;
+		xstart = event.clientX;
+		ystart = event.clientY;
+	});
+
+	win.bind( 'mouseup', function() {
+		dragging = false;
+	});
+	*/
+});
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/flot-0.8.1-time.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,431 @@
+/* Pretty handling of time axes.
+
+Copyright (c) 2007-2013 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+Set axis.mode to "time" to enable. See the section "Time series data" in
+API.txt for details.
+
+*/
+
+(function($) {
+
+	var options = {
+		xaxis: {
+			timezone: null,		// "browser" for local to the client or timezone for timezone-js
+			timeformat: null,	// format string to use
+			twelveHourClock: false,	// 12 or 24 time in time mode
+			monthNames: null	// list of names of months
+		}
+	};
+
+	// round to nearby lower multiple of base
+
+	function floorInBase(n, base) {
+		return base * Math.floor(n / base);
+	}
+
+	// Returns a string with the date d formatted according to fmt.
+	// A subset of the Open Group's strftime format is supported.
+
+	function formatDate(d, fmt, monthNames, dayNames) {
+
+		if (typeof d.strftime == "function") {
+			return d.strftime(fmt);
+		}
+
+		var leftPad = function(n, pad) {
+			n = "" + n;
+			pad = "" + (pad == null ? "0" : pad);
+			return n.length == 1 ? pad + n : n;
+		};
+
+		var r = [];
+		var escape = false;
+		var hours = d.getHours();
+		var isAM = hours < 12;
+
+		if (monthNames == null) {
+			monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+		}
+
+		if (dayNames == null) {
+			dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
+		}
+
+		var hours12;
+
+		if (hours > 12) {
+			hours12 = hours - 12;
+		} else if (hours == 0) {
+			hours12 = 12;
+		} else {
+			hours12 = hours;
+		}
+
+		for (var i = 0; i < fmt.length; ++i) {
+
+			var c = fmt.charAt(i);
+
+			if (escape) {
+				switch (c) {
+					case 'a': c = "" + dayNames[d.getDay()]; break;
+					case 'b': c = "" + monthNames[d.getMonth()]; break;
+					case 'd': c = leftPad(d.getDate()); break;
+					case 'e': c = leftPad(d.getDate(), " "); break;
+					case 'h':	// For back-compat with 0.7; remove in 1.0
+					case 'H': c = leftPad(hours); break;
+					case 'I': c = leftPad(hours12); break;
+					case 'l': c = leftPad(hours12, " "); break;
+					case 'm': c = leftPad(d.getMonth() + 1); break;
+					case 'M': c = leftPad(d.getMinutes()); break;
+					// quarters not in Open Group's strftime specification
+					case 'q':
+						c = "" + (Math.floor(d.getMonth() / 3) + 1); break;
+					case 'S': c = leftPad(d.getSeconds()); break;
+					case 'y': c = leftPad(d.getFullYear() % 100); break;
+					case 'Y': c = "" + d.getFullYear(); break;
+					case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;
+					case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;
+					case 'w': c = "" + d.getDay(); break;
+				}
+				r.push(c);
+				escape = false;
+			} else {
+				if (c == "%") {
+					escape = true;
+				} else {
+					r.push(c);
+				}
+			}
+		}
+
+		return r.join("");
+	}
+
+	// To have a consistent view of time-based data independent of which time
+	// zone the client happens to be in we need a date-like object independent
+	// of time zones.  This is done through a wrapper that only calls the UTC
+	// versions of the accessor methods.
+
+	function makeUtcWrapper(d) {
+
+		function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {
+			sourceObj[sourceMethod] = function() {
+				return targetObj[targetMethod].apply(targetObj, arguments);
+			};
+		};
+
+		var utc = {
+			date: d
+		};
+
+		// support strftime, if found
+
+		if (d.strftime != undefined) {
+			addProxyMethod(utc, "strftime", d, "strftime");
+		}
+
+		addProxyMethod(utc, "getTime", d, "getTime");
+		addProxyMethod(utc, "setTime", d, "setTime");
+
+		var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"];
+
+		for (var p = 0; p < props.length; p++) {
+			addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]);
+			addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]);
+		}
+
+		return utc;
+	};
+
+	// select time zone strategy.  This returns a date-like object tied to the
+	// desired timezone
+
+	function dateGenerator(ts, opts) {
+		if (opts.timezone == "browser") {
+			return new Date(ts);
+		} else if (!opts.timezone || opts.timezone == "utc") {
+			return makeUtcWrapper(new Date(ts));
+		} else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") {
+			var d = new timezoneJS.Date();
+			// timezone-js is fickle, so be sure to set the time zone before
+			// setting the time.
+			d.setTimezone(opts.timezone);
+			d.setTime(ts);
+			return d;
+		} else {
+			return makeUtcWrapper(new Date(ts));
+		}
+	}
+	
+	// map of app. size of time units in milliseconds
+
+	var timeUnitSize = {
+		"second": 1000,
+		"minute": 60 * 1000,
+		"hour": 60 * 60 * 1000,
+		"day": 24 * 60 * 60 * 1000,
+		"month": 30 * 24 * 60 * 60 * 1000,
+		"quarter": 3 * 30 * 24 * 60 * 60 * 1000,
+		"year": 365.2425 * 24 * 60 * 60 * 1000
+	};
+
+	// the allowed tick sizes, after 1 year we use
+	// an integer algorithm
+
+	var baseSpec = [
+		[1, "second"], [2, "second"], [5, "second"], [10, "second"],
+		[30, "second"], 
+		[1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
+		[30, "minute"], 
+		[1, "hour"], [2, "hour"], [4, "hour"],
+		[8, "hour"], [12, "hour"],
+		[1, "day"], [2, "day"], [3, "day"],
+		[0.25, "month"], [0.5, "month"], [1, "month"],
+		[2, "month"]
+	];
+
+	// we don't know which variant(s) we'll need yet, but generating both is
+	// cheap
+
+	var specMonths = baseSpec.concat([[3, "month"], [6, "month"],
+		[1, "year"]]);
+	var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"],
+		[1, "year"]]);
+
+	function init(plot) {
+		plot.hooks.processOptions.push(function (plot, options) {
+			$.each(plot.getAxes(), function(axisName, axis) {
+
+				var opts = axis.options;
+
+				if (opts.mode == "time") {
+					axis.tickGenerator = function(axis) {
+
+						var ticks = [];
+						var d = dateGenerator(axis.min, opts);
+						var minSize = 0;
+
+						// make quarter use a possibility if quarters are
+						// mentioned in either of these options
+
+						var spec = (opts.tickSize && opts.tickSize[1] ===
+							"quarter") ||
+							(opts.minTickSize && opts.minTickSize[1] ===
+							"quarter") ? specQuarters : specMonths;
+
+						if (opts.minTickSize != null) {
+							if (typeof opts.tickSize == "number") {
+								minSize = opts.tickSize;
+							} else {
+								minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];
+							}
+						}
+
+						for (var i = 0; i < spec.length - 1; ++i) {
+							if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]
+											  + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2
+								&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {
+								break;
+							}
+						}
+
+						var size = spec[i][0];
+						var unit = spec[i][1];
+
+						// special-case the possibility of several years
+
+						if (unit == "year") {
+
+							// if given a minTickSize in years, just use it,
+							// ensuring that it's an integer
+
+							if (opts.minTickSize != null && opts.minTickSize[1] == "year") {
+								size = Math.floor(opts.minTickSize[0]);
+							} else {
+
+								var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));
+								var norm = (axis.delta / timeUnitSize.year) / magn;
+
+								if (norm < 1.5) {
+									size = 1;
+								} else if (norm < 3) {
+									size = 2;
+								} else if (norm < 7.5) {
+									size = 5;
+								} else {
+									size = 10;
+								}
+
+								size *= magn;
+							}
+
+							// minimum size for years is 1
+
+							if (size < 1) {
+								size = 1;
+							}
+						}
+
+						axis.tickSize = opts.tickSize || [size, unit];
+						var tickSize = axis.tickSize[0];
+						unit = axis.tickSize[1];
+
+						var step = tickSize * timeUnitSize[unit];
+
+						if (unit == "second") {
+							d.setSeconds(floorInBase(d.getSeconds(), tickSize));
+						} else if (unit == "minute") {
+							d.setMinutes(floorInBase(d.getMinutes(), tickSize));
+						} else if (unit == "hour") {
+							d.setHours(floorInBase(d.getHours(), tickSize));
+						} else if (unit == "month") {
+							d.setMonth(floorInBase(d.getMonth(), tickSize));
+						} else if (unit == "quarter") {
+							d.setMonth(3 * floorInBase(d.getMonth() / 3,
+								tickSize));
+						} else if (unit == "year") {
+							d.setFullYear(floorInBase(d.getFullYear(), tickSize));
+						}
+
+						// reset smaller components
+
+						d.setMilliseconds(0);
+
+						if (step >= timeUnitSize.minute) {
+							d.setSeconds(0);
+						}
+						if (step >= timeUnitSize.hour) {
+							d.setMinutes(0);
+						}
+						if (step >= timeUnitSize.day) {
+							d.setHours(0);
+						}
+						if (step >= timeUnitSize.day * 4) {
+							d.setDate(1);
+						}
+						if (step >= timeUnitSize.month * 2) {
+							d.setMonth(floorInBase(d.getMonth(), 3));
+						}
+						if (step >= timeUnitSize.quarter * 2) {
+							d.setMonth(floorInBase(d.getMonth(), 6));
+						}
+						if (step >= timeUnitSize.year) {
+							d.setMonth(0);
+						}
+
+						var carry = 0;
+						var v = Number.NaN;
+						var prev;
+
+						do {
+
+							prev = v;
+							v = d.getTime();
+							ticks.push(v);
+
+							if (unit == "month" || unit == "quarter") {
+								if (tickSize < 1) {
+
+									// a bit complicated - we'll divide the
+									// month/quarter up but we need to take
+									// care of fractions so we don't end up in
+									// the middle of a day
+
+									d.setDate(1);
+									var start = d.getTime();
+									d.setMonth(d.getMonth() +
+										(unit == "quarter" ? 3 : 1));
+									var end = d.getTime();
+									d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
+									carry = d.getHours();
+									d.setHours(0);
+								} else {
+									d.setMonth(d.getMonth() +
+										tickSize * (unit == "quarter" ? 3 : 1));
+								}
+							} else if (unit == "year") {
+								d.setFullYear(d.getFullYear() + tickSize);
+							} else {
+								d.setTime(v + step);
+							}
+						} while (v < axis.max && v != prev);
+
+						return ticks;
+					};
+
+					axis.tickFormatter = function (v, axis) {
+
+						var d = dateGenerator(v, axis.options);
+
+						// first check global format
+
+						if (opts.timeformat != null) {
+							return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);
+						}
+
+						// possibly use quarters if quarters are mentioned in
+						// any of these places
+
+						var useQuarters = (axis.options.tickSize &&
+								axis.options.tickSize[1] == "quarter") ||
+							(axis.options.minTickSize &&
+								axis.options.minTickSize[1] == "quarter");
+
+						var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
+						var span = axis.max - axis.min;
+						var suffix = (opts.twelveHourClock) ? " %p" : "";
+						var hourCode = (opts.twelveHourClock) ? "%I" : "%H";
+						var fmt;
+
+						if (t < timeUnitSize.minute) {
+							fmt = hourCode + ":%M:%S" + suffix;
+						} else if (t < timeUnitSize.day) {
+							if (span < 2 * timeUnitSize.day) {
+								fmt = hourCode + ":%M" + suffix;
+							} else {
+								fmt = "%b %d " + hourCode + ":%M" + suffix;
+							}
+						} else if (t < timeUnitSize.month) {
+							fmt = "%b %d";
+						} else if ((useQuarters && t < timeUnitSize.quarter) ||
+							(!useQuarters && t < timeUnitSize.year)) {
+							if (span < timeUnitSize.year) {
+								fmt = "%b";
+							} else {
+								fmt = "%b %Y";
+							}
+						} else if (useQuarters && t < timeUnitSize.year) {
+							if (span < timeUnitSize.year) {
+								fmt = "Q%q";
+							} else {
+								fmt = "Q%q %Y";
+							}
+						} else {
+							fmt = "%Y";
+						}
+
+						var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);
+
+						return rt;
+					};
+				}
+			});
+		});
+	}
+
+	$.plot.plugins.push({
+		init: init,
+		options: options,
+		name: 'time',
+		version: '1.0'
+	});
+
+	// Time-axis support used to be in Flot core, which exposed the
+	// formatDate function on the plot object.  Various plugins depend
+	// on the function, so we need to re-expose it here.
+
+	$.plot.formatDate = formatDate;
+
+})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/flot-0.8.1.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,3061 @@
+/* Javascript plotting library for jQuery, version 0.8.1.
+
+Copyright (c) 2007-2013 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+
+// first an inline dependency, jquery.colorhelpers.js, we inline it here
+// for convenience
+
+/* Plugin for jQuery for working with colors.
+ *
+ * Version 1.1.
+ *
+ * Inspiration from jQuery color animation plugin by John Resig.
+ *
+ * Released under the MIT license by Ole Laursen, October 2009.
+ *
+ * Examples:
+ *
+ *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
+ *   var c = $.color.extract($("#mydiv"), 'background-color');
+ *   console.log(c.r, c.g, c.b, c.a);
+ *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
+ *
+ * Note that .scale() and .add() return the same modified object
+ * instead of making a new one.
+ *
+ * V. 1.1: Fix error handling so e.g. parsing an empty string does
+ * produce a color rather than just crashing.
+ */
+(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
+
+// the actual Flot code
+(function($) {
+
+	// Cache the prototype hasOwnProperty for faster access
+
+	var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+	///////////////////////////////////////////////////////////////////////////
+	// The Canvas object is a wrapper around an HTML5 <canvas> tag.
+	//
+	// @constructor
+	// @param {string} cls List of classes to apply to the canvas.
+	// @param {element} container Element onto which to append the canvas.
+	//
+	// Requiring a container is a little iffy, but unfortunately canvas
+	// operations don't work unless the canvas is attached to the DOM.
+
+	function Canvas(cls, container) {
+
+		var element = container.children("." + cls)[0];
+
+		if (element == null) {
+
+			element = document.createElement("canvas");
+			element.className = cls;
+
+			$(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
+				.appendTo(container);
+
+			// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
+
+			if (!element.getContext) {
+				if (window.G_vmlCanvasManager) {
+					element = window.G_vmlCanvasManager.initElement(element);
+				} else {
+					throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
+				}
+			}
+		}
+
+		this.element = element;
+
+		var context = this.context = element.getContext("2d");
+
+		// Determine the screen's ratio of physical to device-independent
+		// pixels.  This is the ratio between the canvas width that the browser
+		// advertises and the number of pixels actually present in that space.
+
+		// The iPhone 4, for example, has a device-independent width of 320px,
+		// but its screen is actually 640px wide.  It therefore has a pixel
+		// ratio of 2, while most normal devices have a ratio of 1.
+
+		var devicePixelRatio = window.devicePixelRatio || 1,
+			backingStoreRatio =
+				context.webkitBackingStorePixelRatio ||
+				context.mozBackingStorePixelRatio ||
+				context.msBackingStorePixelRatio ||
+				context.oBackingStorePixelRatio ||
+				context.backingStorePixelRatio || 1;
+
+		this.pixelRatio = devicePixelRatio / backingStoreRatio;
+
+		// Size the canvas to match the internal dimensions of its container
+
+		this.resize(container.width(), container.height());
+
+		// Collection of HTML div layers for text overlaid onto the canvas
+
+		this.textContainer = null;
+		this.text = {};
+
+		// Cache of text fragments and metrics, so we can avoid expensively
+		// re-calculating them when the plot is re-rendered in a loop.
+
+		this._textCache = {};
+	}
+
+	// Resizes the canvas to the given dimensions.
+	//
+	// @param {number} width New width of the canvas, in pixels.
+	// @param {number} width New height of the canvas, in pixels.
+
+	Canvas.prototype.resize = function(width, height) {
+
+		if (width <= 0 || height <= 0) {
+			throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
+		}
+
+		var element = this.element,
+			context = this.context,
+			pixelRatio = this.pixelRatio;
+
+		// Resize the canvas, increasing its density based on the display's
+		// pixel ratio; basically giving it more pixels without increasing the
+		// size of its element, to take advantage of the fact that retina
+		// displays have that many more pixels in the same advertised space.
+
+		// Resizing should reset the state (excanvas seems to be buggy though)
+
+		if (this.width != width) {
+			element.width = width * pixelRatio;
+			element.style.width = width + "px";
+			this.width = width;
+		}
+
+		if (this.height != height) {
+			element.height = height * pixelRatio;
+			element.style.height = height + "px";
+			this.height = height;
+		}
+
+		// Save the context, so we can reset in case we get replotted.  The
+		// restore ensure that we're really back at the initial state, and
+		// should be safe even if we haven't saved the initial state yet.
+
+		context.restore();
+		context.save();
+
+		// Scale the coordinate space to match the display density; so even though we
+		// may have twice as many pixels, we still want lines and other drawing to
+		// appear at the same size; the extra pixels will just make them crisper.
+
+		context.scale(pixelRatio, pixelRatio);
+	};
+
+	// Clears the entire canvas area, not including any overlaid HTML text
+
+	Canvas.prototype.clear = function() {
+		this.context.clearRect(0, 0, this.width, this.height);
+	};
+
+	// Finishes rendering the canvas, including managing the text overlay.
+
+	Canvas.prototype.render = function() {
+
+		var cache = this._textCache;
+
+		// For each text layer, add elements marked as active that haven't
+		// already been rendered, and remove those that are no longer active.
+
+		for (var layerKey in cache) {
+			if (hasOwnProperty.call(cache, layerKey)) {
+
+				var layer = this.getTextLayer(layerKey),
+					layerCache = cache[layerKey];
+
+				layer.hide();
+
+				for (var styleKey in layerCache) {
+					if (hasOwnProperty.call(layerCache, styleKey)) {
+						var styleCache = layerCache[styleKey];
+						for (var key in styleCache) {
+							if (hasOwnProperty.call(styleCache, key)) {
+
+								var positions = styleCache[key].positions;
+
+								for (var i = 0, position; position = positions[i]; i++) {
+									if (position.active) {
+										if (!position.rendered) {
+											layer.append(position.element);
+											position.rendered = true;
+										}
+									} else {
+										positions.splice(i--, 1);
+										if (position.rendered) {
+											position.element.detach();
+										}
+									}
+								}
+
+								if (positions.length == 0) {
+									delete styleCache[key];
+								}
+							}
+						}
+					}
+				}
+
+				layer.show();
+			}
+		}
+	};
+
+	// Creates (if necessary) and returns the text overlay container.
+	//
+	// @param {string} classes String of space-separated CSS classes used to
+	//     uniquely identify the text layer.
+	// @return {object} The jQuery-wrapped text-layer div.
+
+	Canvas.prototype.getTextLayer = function(classes) {
+
+		var layer = this.text[classes];
+
+		// Create the text layer if it doesn't exist
+
+		if (layer == null) {
+
+			// Create the text layer container, if it doesn't exist
+
+			if (this.textContainer == null) {
+				this.textContainer = $("<div class='flot-text'></div>")
+					.css({
+						position: "absolute",
+						top: 0,
+						left: 0,
+						bottom: 0,
+						right: 0,
+						'font-size': "smaller",
+						color: "#545454"
+					})
+					.insertAfter(this.element);
+			}
+
+			layer = this.text[classes] = $("<div></div>")
+				.addClass(classes)
+				.css({
+					position: "absolute",
+					top: 0,
+					left: 0,
+					bottom: 0,
+					right: 0
+				})
+				.appendTo(this.textContainer);
+		}
+
+		return layer;
+	};
+
+	// Creates (if necessary) and returns a text info object.
+	//
+	// The object looks like this:
+	//
+	// {
+	//     width: Width of the text's wrapper div.
+	//     height: Height of the text's wrapper div.
+	//     element: The jQuery-wrapped HTML div containing the text.
+	//     positions: Array of positions at which this text is drawn.
+	// }
+	//
+	// The positions array contains objects that look like this:
+	//
+	// {
+	//     active: Flag indicating whether the text should be visible.
+	//     rendered: Flag indicating whether the text is currently visible.
+	//     element: The jQuery-wrapped HTML div containing the text.
+	//     x: X coordinate at which to draw the text.
+	//     y: Y coordinate at which to draw the text.
+	// }
+	//
+	// Each position after the first receives a clone of the original element.
+	//
+	// The idea is that that the width, height, and general 'identity' of the
+	// text is constant no matter where it is placed; the placements are a
+	// secondary property.
+	//
+	// Canvas maintains a cache of recently-used text info objects; getTextInfo
+	// either returns the cached element or creates a new entry.
+	//
+	// @param {string} layer A string of space-separated CSS classes uniquely
+	//     identifying the layer containing this text.
+	// @param {string} text Text string to retrieve info for.
+	// @param {(string|object)=} font Either a string of space-separated CSS
+	//     classes or a font-spec object, defining the text's font and style.
+	// @param {number=} angle Angle at which to rotate the text, in degrees.
+	//     Angle is currently unused, it will be implemented in the future.
+	// @param {number=} width Maximum width of the text before it wraps.
+	// @return {object} a text info object.
+
+	Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
+
+		var textStyle, layerCache, styleCache, info;
+
+		// Cast the value to a string, in case we were given a number or such
+
+		text = "" + text;
+
+		// If the font is a font-spec object, generate a CSS font definition
+
+		if (typeof font === "object") {
+			textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
+		} else {
+			textStyle = font;
+		}
+
+		// Retrieve (or create) the cache for the text's layer and styles
+
+		layerCache = this._textCache[layer];
+
+		if (layerCache == null) {
+			layerCache = this._textCache[layer] = {};
+		}
+
+		styleCache = layerCache[textStyle];
+
+		if (styleCache == null) {
+			styleCache = layerCache[textStyle] = {};
+		}
+
+		info = styleCache[text];
+
+		// If we can't find a matching element in our cache, create a new one
+
+		if (info == null) {
+
+			var element = $("<div></div>").html(text)
+				.css({
+					position: "absolute",
+					'max-width': width,
+					top: -9999
+				})
+				.appendTo(this.getTextLayer(layer));
+
+			if (typeof font === "object") {
+				element.css({
+					font: textStyle,
+					color: font.color
+				});
+			} else if (typeof font === "string") {
+				element.addClass(font);
+			}
+
+			info = styleCache[text] = {
+				width: element.outerWidth(true),
+				height: element.outerHeight(true),
+				element: element,
+				positions: []
+			};
+
+			element.detach();
+		}
+
+		return info;
+	};
+
+	// Adds a text string to the canvas text overlay.
+	//
+	// The text isn't drawn immediately; it is marked as rendering, which will
+	// result in its addition to the canvas on the next render pass.
+	//
+	// @param {string} layer A string of space-separated CSS classes uniquely
+	//     identifying the layer containing this text.
+	// @param {number} x X coordinate at which to draw the text.
+	// @param {number} y Y coordinate at which to draw the text.
+	// @param {string} text Text string to draw.
+	// @param {(string|object)=} font Either a string of space-separated CSS
+	//     classes or a font-spec object, defining the text's font and style.
+	// @param {number=} angle Angle at which to rotate the text, in degrees.
+	//     Angle is currently unused, it will be implemented in the future.
+	// @param {number=} width Maximum width of the text before it wraps.
+	// @param {string=} halign Horizontal alignment of the text; either "left",
+	//     "center" or "right".
+	// @param {string=} valign Vertical alignment of the text; either "top",
+	//     "middle" or "bottom".
+
+	Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
+
+		var info = this.getTextInfo(layer, text, font, angle, width),
+			positions = info.positions;
+
+		// Tweak the div's position to match the text's alignment
+
+		if (halign == "center") {
+			x -= info.width / 2;
+		} else if (halign == "right") {
+			x -= info.width;
+		}
+
+		if (valign == "middle") {
+			y -= info.height / 2;
+		} else if (valign == "bottom") {
+			y -= info.height;
+		}
+
+		// Determine whether this text already exists at this position.
+		// If so, mark it for inclusion in the next render pass.
+
+		for (var i = 0, position; position = positions[i]; i++) {
+			if (position.x == x && position.y == y) {
+				position.active = true;
+				return;
+			}
+		}
+
+		// If the text doesn't exist at this position, create a new entry
+
+		// For the very first position we'll re-use the original element,
+		// while for subsequent ones we'll clone it.
+
+		position = {
+			active: true,
+			rendered: false,
+			element: positions.length ? info.element.clone() : info.element,
+			x: x,
+			y: y
+		}
+
+		positions.push(position);
+
+		// Move the element to its final position within the container
+
+		position.element.css({
+			top: Math.round(y),
+			left: Math.round(x),
+			'text-align': halign	// In case the text wraps
+		});
+	};
+
+	// Removes one or more text strings from the canvas text overlay.
+	//
+	// If no parameters are given, all text within the layer is removed.
+	//
+	// Note that the text is not immediately removed; it is simply marked as
+	// inactive, which will result in its removal on the next render pass.
+	// This avoids the performance penalty for 'clear and redraw' behavior,
+	// where we potentially get rid of all text on a layer, but will likely
+	// add back most or all of it later, as when redrawing axes, for example.
+	//
+	// @param {string} layer A string of space-separated CSS classes uniquely
+	//     identifying the layer containing this text.
+	// @param {number=} x X coordinate of the text.
+	// @param {number=} y Y coordinate of the text.
+	// @param {string=} text Text string to remove.
+	// @param {(string|object)=} font Either a string of space-separated CSS
+	//     classes or a font-spec object, defining the text's font and style.
+	// @param {number=} angle Angle at which the text is rotated, in degrees.
+	//     Angle is currently unused, it will be implemented in the future.
+
+	Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
+		if (text == null) {
+			var layerCache = this._textCache[layer];
+			if (layerCache != null) {
+				for (var styleKey in layerCache) {
+					if (hasOwnProperty.call(layerCache, styleKey)) {
+						var styleCache = layerCache[styleKey];
+						for (var key in styleCache) {
+							if (hasOwnProperty.call(styleCache, key)) {
+								var positions = styleCache[key].positions;
+								for (var i = 0, position; position = positions[i]; i++) {
+									position.active = false;
+								}
+							}
+						}
+					}
+				}
+			}
+		} else {
+			var positions = this.getTextInfo(layer, text, font, angle).positions;
+			for (var i = 0, position; position = positions[i]; i++) {
+				if (position.x == x && position.y == y) {
+					position.active = false;
+				}
+			}
+		}
+	};
+
+	///////////////////////////////////////////////////////////////////////////
+	// The top-level container for the entire plot.
+
+    function Plot(placeholder, data_, options_, plugins) {
+        // data is on the form:
+        //   [ series1, series2 ... ]
+        // where series is either just the data as [ [x1, y1], [x2, y2], ... ]
+        // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
+
+        var series = [],
+            options = {
+                // the color theme used for graphs
+                colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
+                legend: {
+                    show: true,
+                    noColumns: 1, // number of colums in legend table
+                    labelFormatter: null, // fn: string -> string
+                    labelBoxBorderColor: "#ccc", // border color for the little label boxes
+                    container: null, // container (as jQuery object) to put legend in, null means default on top of graph
+                    position: "ne", // position of default legend container within plot
+                    margin: 5, // distance from grid edge to default legend container within plot
+                    backgroundColor: null, // null means auto-detect
+                    backgroundOpacity: 0.85, // set to 0 to avoid background
+                    sorted: null    // default to no legend sorting
+                },
+                xaxis: {
+                    show: null, // null = auto-detect, true = always, false = never
+                    position: "bottom", // or "top"
+                    mode: null, // null or "time"
+                    font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
+                    color: null, // base color, labels, ticks
+                    tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
+                    transform: null, // null or f: number -> number to transform axis
+                    inverseTransform: null, // if transform is set, this should be the inverse function
+                    min: null, // min. value to show, null means set automatically
+                    max: null, // max. value to show, null means set automatically
+                    autoscaleMargin: null, // margin in % to add if auto-setting min/max
+                    ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
+                    tickFormatter: null, // fn: number -> string
+                    labelWidth: null, // size of tick labels in pixels
+                    labelHeight: null,
+                    reserveSpace: null, // whether to reserve space even if axis isn't shown
+                    tickLength: null, // size in pixels of ticks, or "full" for whole line
+                    alignTicksWithAxis: null, // axis number or null for no sync
+                    tickDecimals: null, // no. of decimals, null means auto
+                    tickSize: null, // number or [number, "unit"]
+                    minTickSize: null // number or [number, "unit"]
+                },
+                yaxis: {
+                    autoscaleMargin: 0.02,
+                    position: "left" // or "right"
+                },
+                xaxes: [],
+                yaxes: [],
+                series: {
+                    points: {
+                        show: false,
+                        radius: 3,
+                        lineWidth: 2, // in pixels
+                        fill: true,
+                        fillColor: "#ffffff",
+                        symbol: "circle" // or callback
+                    },
+                    lines: {
+                        // we don't put in show: false so we can see
+                        // whether lines were actively disabled
+                        lineWidth: 2, // in pixels
+                        fill: false,
+                        fillColor: null,
+                        steps: false
+                        // Omit 'zero', so we can later default its value to
+                        // match that of the 'fill' option.
+                    },
+                    bars: {
+                        show: false,
+                        lineWidth: 2, // in pixels
+                        barWidth: 1, // in units of the x axis
+                        fill: true,
+                        fillColor: null,
+                        align: "left", // "left", "right", or "center"
+                        horizontal: false,
+                        zero: true
+                    },
+                    shadowSize: 3,
+                    highlightColor: null
+                },
+                grid: {
+                    show: true,
+                    aboveData: false,
+                    color: "#545454", // primary color used for outline and labels
+                    backgroundColor: null, // null for transparent, else color
+                    borderColor: null, // set if different from the grid color
+                    tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
+                    margin: 0, // distance from the canvas edge to the grid
+                    labelMargin: 5, // in pixels
+                    axisMargin: 8, // in pixels
+                    borderWidth: 2, // in pixels
+                    minBorderMargin: null, // in pixels, null means taken from points radius
+                    markings: null, // array of ranges or fn: axes -> array of ranges
+                    markingsColor: "#f4f4f4",
+                    markingsLineWidth: 2,
+                    // interactive stuff
+                    clickable: false,
+                    hoverable: false,
+                    autoHighlight: true, // highlight in case mouse is near
+                    mouseActiveRadius: 10 // how far the mouse can be away to activate an item
+                },
+                interaction: {
+                    redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
+                },
+                hooks: {}
+            },
+        surface = null,     // the canvas for the plot itself
+        overlay = null,     // canvas for interactive stuff on top of plot
+        eventHolder = null, // jQuery object that events should be bound to
+        ctx = null, octx = null,
+        xaxes = [], yaxes = [],
+        plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
+        plotWidth = 0, plotHeight = 0,
+        hooks = {
+            processOptions: [],
+            processRawData: [],
+            processDatapoints: [],
+            processOffset: [],
+            drawBackground: [],
+            drawSeries: [],
+            draw: [],
+            bindEvents: [],
+            drawOverlay: [],
+            shutdown: []
+        },
+        plot = this;
+
+        // public functions
+        plot.setData = setData;
+        plot.setupGrid = setupGrid;
+        plot.draw = draw;
+        plot.getPlaceholder = function() { return placeholder; };
+        plot.getCanvas = function() { return surface.element; };
+        plot.getPlotOffset = function() { return plotOffset; };
+        plot.width = function () { return plotWidth; };
+        plot.height = function () { return plotHeight; };
+        plot.offset = function () {
+            var o = eventHolder.offset();
+            o.left += plotOffset.left;
+            o.top += plotOffset.top;
+            return o;
+        };
+        plot.getData = function () { return series; };
+        plot.getAxes = function () {
+            var res = {}, i;
+            $.each(xaxes.concat(yaxes), function (_, axis) {
+                if (axis)
+                    res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
+            });
+            return res;
+        };
+        plot.getXAxes = function () { return xaxes; };
+        plot.getYAxes = function () { return yaxes; };
+        plot.c2p = canvasToAxisCoords;
+        plot.p2c = axisToCanvasCoords;
+        plot.getOptions = function () { return options; };
+        plot.highlight = highlight;
+        plot.unhighlight = unhighlight;
+        plot.triggerRedrawOverlay = triggerRedrawOverlay;
+        plot.pointOffset = function(point) {
+            return {
+                left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
+                top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
+            };
+        };
+        plot.shutdown = shutdown;
+        plot.resize = function () {
+        	var width = placeholder.width(),
+        		height = placeholder.height();
+            surface.resize(width, height);
+            overlay.resize(width, height);
+        };
+
+        // public attributes
+        plot.hooks = hooks;
+
+        // initialize
+        initPlugins(plot);
+        parseOptions(options_);
+        setupCanvases();
+        setData(data_);
+        setupGrid();
+        draw();
+        bindEvents();
+
+
+        function executeHooks(hook, args) {
+            args = [plot].concat(args);
+            for (var i = 0; i < hook.length; ++i)
+                hook[i].apply(this, args);
+        }
+
+        function initPlugins() {
+
+            // References to key classes, allowing plugins to modify them
+
+            var classes = {
+                Canvas: Canvas
+            };
+
+            for (var i = 0; i < plugins.length; ++i) {
+                var p = plugins[i];
+                p.init(plot, classes);
+                if (p.options)
+                    $.extend(true, options, p.options);
+            }
+        }
+
+        function parseOptions(opts) {
+
+            $.extend(true, options, opts);
+
+            // $.extend merges arrays, rather than replacing them.  When less
+            // colors are provided than the size of the default palette, we
+            // end up with those colors plus the remaining defaults, which is
+            // not expected behavior; avoid it by replacing them here.
+
+            if (opts && opts.colors) {
+            	options.colors = opts.colors;
+            }
+
+            if (options.xaxis.color == null)
+                options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
+            if (options.yaxis.color == null)
+                options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
+
+            if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
+                options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
+            if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
+                options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
+
+            if (options.grid.borderColor == null)
+                options.grid.borderColor = options.grid.color;
+            if (options.grid.tickColor == null)
+                options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
+
+            // Fill in defaults for axis options, including any unspecified
+            // font-spec fields, if a font-spec was provided.
+
+            // If no x/y axis options were provided, create one of each anyway,
+            // since the rest of the code assumes that they exist.
+
+            var i, axisOptions, axisCount,
+                fontDefaults = {
+                    style: placeholder.css("font-style"),
+                    size: Math.round(0.8 * (+placeholder.css("font-size").replace("px", "") || 13)),
+                    variant: placeholder.css("font-variant"),
+                    weight: placeholder.css("font-weight"),
+                    family: placeholder.css("font-family")
+                };
+
+            fontDefaults.lineHeight = fontDefaults.size * 1.15;
+
+            axisCount = options.xaxes.length || 1;
+            for (i = 0; i < axisCount; ++i) {
+
+                axisOptions = options.xaxes[i];
+                if (axisOptions && !axisOptions.tickColor) {
+                    axisOptions.tickColor = axisOptions.color;
+                }
+
+                axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
+                options.xaxes[i] = axisOptions;
+
+                if (axisOptions.font) {
+                    axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
+                    if (!axisOptions.font.color) {
+                        axisOptions.font.color = axisOptions.color;
+                    }
+                }
+            }
+
+            axisCount = options.yaxes.length || 1;
+            for (i = 0; i < axisCount; ++i) {
+
+                axisOptions = options.yaxes[i];
+                if (axisOptions && !axisOptions.tickColor) {
+                    axisOptions.tickColor = axisOptions.color;
+                }
+
+                axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
+                options.yaxes[i] = axisOptions;
+
+                if (axisOptions.font) {
+                    axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
+                    if (!axisOptions.font.color) {
+                        axisOptions.font.color = axisOptions.color;
+                    }
+                }
+            }
+
+            // backwards compatibility, to be removed in future
+            if (options.xaxis.noTicks && options.xaxis.ticks == null)
+                options.xaxis.ticks = options.xaxis.noTicks;
+            if (options.yaxis.noTicks && options.yaxis.ticks == null)
+                options.yaxis.ticks = options.yaxis.noTicks;
+            if (options.x2axis) {
+                options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
+                options.xaxes[1].position = "top";
+            }
+            if (options.y2axis) {
+                options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
+                options.yaxes[1].position = "right";
+            }
+            if (options.grid.coloredAreas)
+                options.grid.markings = options.grid.coloredAreas;
+            if (options.grid.coloredAreasColor)
+                options.grid.markingsColor = options.grid.coloredAreasColor;
+            if (options.lines)
+                $.extend(true, options.series.lines, options.lines);
+            if (options.points)
+                $.extend(true, options.series.points, options.points);
+            if (options.bars)
+                $.extend(true, options.series.bars, options.bars);
+            if (options.shadowSize != null)
+                options.series.shadowSize = options.shadowSize;
+            if (options.highlightColor != null)
+                options.series.highlightColor = options.highlightColor;
+
+            // save options on axes for future reference
+            for (i = 0; i < options.xaxes.length; ++i)
+                getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
+            for (i = 0; i < options.yaxes.length; ++i)
+                getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
+
+            // add hooks from options
+            for (var n in hooks)
+                if (options.hooks[n] && options.hooks[n].length)
+                    hooks[n] = hooks[n].concat(options.hooks[n]);
+
+            executeHooks(hooks.processOptions, [options]);
+        }
+
+        function setData(d) {
+            series = parseData(d);
+            fillInSeriesOptions();
+            processData();
+        }
+
+        function parseData(d) {
+            var res = [];
+            for (var i = 0; i < d.length; ++i) {
+                var s = $.extend(true, {}, options.series);
+
+                if (d[i].data != null) {
+                    s.data = d[i].data; // move the data instead of deep-copy
+                    delete d[i].data;
+
+                    $.extend(true, s, d[i]);
+
+                    d[i].data = s.data;
+                }
+                else
+                    s.data = d[i];
+                res.push(s);
+            }
+
+            return res;
+        }
+
+        function axisNumber(obj, coord) {
+            var a = obj[coord + "axis"];
+            if (typeof a == "object") // if we got a real axis, extract number
+                a = a.n;
+            if (typeof a != "number")
+                a = 1; // default to first axis
+            return a;
+        }
+
+        function allAxes() {
+            // return flat array without annoying null entries
+            return $.grep(xaxes.concat(yaxes), function (a) { return a; });
+        }
+
+        function canvasToAxisCoords(pos) {
+            // return an object with x/y corresponding to all used axes
+            var res = {}, i, axis;
+            for (i = 0; i < xaxes.length; ++i) {
+                axis = xaxes[i];
+                if (axis && axis.used)
+                    res["x" + axis.n] = axis.c2p(pos.left);
+            }
+
+            for (i = 0; i < yaxes.length; ++i) {
+                axis = yaxes[i];
+                if (axis && axis.used)
+                    res["y" + axis.n] = axis.c2p(pos.top);
+            }
+
+            if (res.x1 !== undefined)
+                res.x = res.x1;
+            if (res.y1 !== undefined)
+                res.y = res.y1;
+
+            return res;
+        }
+
+        function axisToCanvasCoords(pos) {
+            // get canvas coords from the first pair of x/y found in pos
+            var res = {}, i, axis, key;
+
+            for (i = 0; i < xaxes.length; ++i) {
+                axis = xaxes[i];
+                if (axis && axis.used) {
+                    key = "x" + axis.n;
+                    if (pos[key] == null && axis.n == 1)
+                        key = "x";
+
+                    if (pos[key] != null) {
+                        res.left = axis.p2c(pos[key]);
+                        break;
+                    }
+                }
+            }
+
+            for (i = 0; i < yaxes.length; ++i) {
+                axis = yaxes[i];
+                if (axis && axis.used) {
+                    key = "y" + axis.n;
+                    if (pos[key] == null && axis.n == 1)
+                        key = "y";
+
+                    if (pos[key] != null) {
+                        res.top = axis.p2c(pos[key]);
+                        break;
+                    }
+                }
+            }
+
+            return res;
+        }
+
+        function getOrCreateAxis(axes, number) {
+            if (!axes[number - 1])
+                axes[number - 1] = {
+                    n: number, // save the number for future reference
+                    direction: axes == xaxes ? "x" : "y",
+                    options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
+                };
+
+            return axes[number - 1];
+        }
+
+        function fillInSeriesOptions() {
+
+            var neededColors = series.length, maxIndex = -1, i;
+
+            // Subtract the number of series that already have fixed colors or
+            // color indexes from the number that we still need to generate.
+
+            for (i = 0; i < series.length; ++i) {
+                var sc = series[i].color;
+                if (sc != null) {
+                    neededColors--;
+                    if (typeof sc == "number" && sc > maxIndex) {
+                        maxIndex = sc;
+                    }
+                }
+            }
+
+            // If any of the series have fixed color indexes, then we need to
+            // generate at least as many colors as the highest index.
+
+            if (neededColors <= maxIndex) {
+                neededColors = maxIndex + 1;
+            }
+
+            // Generate all the colors, using first the option colors and then
+            // variations on those colors once they're exhausted.
+
+            var c, colors = [], colorPool = options.colors,
+                colorPoolSize = colorPool.length, variation = 0;
+
+            for (i = 0; i < neededColors; i++) {
+
+                c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
+
+                // Each time we exhaust the colors in the pool we adjust
+                // a scaling factor used to produce more variations on
+                // those colors. The factor alternates negative/positive
+                // to produce lighter/darker colors.
+
+                // Reset the variation after every few cycles, or else
+                // it will end up producing only white or black colors.
+
+                if (i % colorPoolSize == 0 && i) {
+                    if (variation >= 0) {
+                        if (variation < 0.5) {
+                            variation = -variation - 0.2;
+                        } else variation = 0;
+                    } else variation = -variation;
+                }
+
+                colors[i] = c.scale('rgb', 1 + variation);
+            }
+
+            // Finalize the series options, filling in their colors
+
+            var colori = 0, s;
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                // assign colors
+                if (s.color == null) {
+                    s.color = colors[colori].toString();
+                    ++colori;
+                }
+                else if (typeof s.color == "number")
+                    s.color = colors[s.color].toString();
+
+                // turn on lines automatically in case nothing is set
+                if (s.lines.show == null) {
+                    var v, show = true;
+                    for (v in s)
+                        if (s[v] && s[v].show) {
+                            show = false;
+                            break;
+                        }
+                    if (show)
+                        s.lines.show = true;
+                }
+
+                // If nothing was provided for lines.zero, default it to match
+                // lines.fill, since areas by default should extend to zero.
+
+                if (s.lines.zero == null) {
+                    s.lines.zero = !!s.lines.fill;
+                }
+
+                // setup axes
+                s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
+                s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
+            }
+        }
+
+        function processData() {
+            var topSentry = Number.POSITIVE_INFINITY,
+                bottomSentry = Number.NEGATIVE_INFINITY,
+                fakeInfinity = Number.MAX_VALUE,
+                i, j, k, m, length,
+                s, points, ps, x, y, axis, val, f, p,
+                data, format;
+
+            function updateAxis(axis, min, max) {
+                if (min < axis.datamin && min != -fakeInfinity)
+                    axis.datamin = min;
+                if (max > axis.datamax && max != fakeInfinity)
+                    axis.datamax = max;
+            }
+
+            $.each(allAxes(), function (_, axis) {
+                // init axis
+                axis.datamin = topSentry;
+                axis.datamax = bottomSentry;
+                axis.used = false;
+            });
+
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                s.datapoints = { points: [] };
+
+                executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
+            }
+
+            // first pass: clean and copy data
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                data = s.data;
+                format = s.datapoints.format;
+
+                if (!format) {
+                    format = [];
+                    // find out how to copy
+                    format.push({ x: true, number: true, required: true });
+                    format.push({ y: true, number: true, required: true });
+
+                    if (s.bars.show || (s.lines.show && s.lines.fill)) {
+                        var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
+                        format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
+                        if (s.bars.horizontal) {
+                            delete format[format.length - 1].y;
+                            format[format.length - 1].x = true;
+                        }
+                    }
+
+                    s.datapoints.format = format;
+                }
+
+                if (s.datapoints.pointsize != null)
+                    continue; // already filled in
+
+                s.datapoints.pointsize = format.length;
+
+                ps = s.datapoints.pointsize;
+                points = s.datapoints.points;
+
+                var insertSteps = s.lines.show && s.lines.steps;
+                s.xaxis.used = s.yaxis.used = true;
+
+                for (j = k = 0; j < data.length; ++j, k += ps) {
+                    p = data[j];
+
+                    var nullify = p == null;
+                    if (!nullify) {
+                        for (m = 0; m < ps; ++m) {
+                            val = p[m];
+                            f = format[m];
+
+                            if (f) {
+                                if (f.number && val != null) {
+                                    val = +val; // convert to number
+                                    if (isNaN(val))
+                                        val = null;
+                                    else if (val == Infinity)
+                                        val = fakeInfinity;
+                                    else if (val == -Infinity)
+                                        val = -fakeInfinity;
+                                }
+
+                                if (val == null) {
+                                    if (f.required)
+                                        nullify = true;
+
+                                    if (f.defaultValue != null)
+                                        val = f.defaultValue;
+                                }
+                            }
+
+                            points[k + m] = val;
+                        }
+                    }
+
+                    if (nullify) {
+                        for (m = 0; m < ps; ++m) {
+                            val = points[k + m];
+                            if (val != null) {
+                                f = format[m];
+                                // extract min/max info
+                                if (f.autoscale) {
+                                    if (f.x) {
+                                        updateAxis(s.xaxis, val, val);
+                                    }
+                                    if (f.y) {
+                                        updateAxis(s.yaxis, val, val);
+                                    }
+                                }
+                            }
+                            points[k + m] = null;
+                        }
+                    }
+                    else {
+                        // a little bit of line specific stuff that
+                        // perhaps shouldn't be here, but lacking
+                        // better means...
+                        if (insertSteps && k > 0
+                            && points[k - ps] != null
+                            && points[k - ps] != points[k]
+                            && points[k - ps + 1] != points[k + 1]) {
+                            // copy the point to make room for a middle point
+                            for (m = 0; m < ps; ++m)
+                                points[k + ps + m] = points[k + m];
+
+                            // middle point has same y
+                            points[k + 1] = points[k - ps + 1];
+
+                            // we've added a point, better reflect that
+                            k += ps;
+                        }
+                    }
+                }
+            }
+
+            // give the hooks a chance to run
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
+            }
+
+            // second pass: find datamax/datamin for auto-scaling
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                points = s.datapoints.points;
+                ps = s.datapoints.pointsize;
+                format = s.datapoints.format;
+
+                var xmin = topSentry, ymin = topSentry,
+                    xmax = bottomSentry, ymax = bottomSentry;
+
+                for (j = 0; j < points.length; j += ps) {
+                    if (points[j] == null)
+                        continue;
+
+                    for (m = 0; m < ps; ++m) {
+                        val = points[j + m];
+                        f = format[m];
+                        if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
+                            continue;
+
+                        if (f.x) {
+                            if (val < xmin)
+                                xmin = val;
+                            if (val > xmax)
+                                xmax = val;
+                        }
+                        if (f.y) {
+                            if (val < ymin)
+                                ymin = val;
+                            if (val > ymax)
+                                ymax = val;
+                        }
+                    }
+                }
+
+                if (s.bars.show) {
+                    // make sure we got room for the bar on the dancing floor
+                    var delta;
+
+                    switch (s.bars.align) {
+                        case "left":
+                            delta = 0;
+                            break;
+                        case "right":
+                            delta = -s.bars.barWidth;
+                            break;
+                        case "center":
+                            delta = -s.bars.barWidth / 2;
+                            break;
+                        default:
+                            throw new Error("Invalid bar alignment: " + s.bars.align);
+                    }
+
+                    if (s.bars.horizontal) {
+                        ymin += delta;
+                        ymax += delta + s.bars.barWidth;
+                    }
+                    else {
+                        xmin += delta;
+                        xmax += delta + s.bars.barWidth;
+                    }
+                }
+
+                updateAxis(s.xaxis, xmin, xmax);
+                updateAxis(s.yaxis, ymin, ymax);
+            }
+
+            $.each(allAxes(), function (_, axis) {
+                if (axis.datamin == topSentry)
+                    axis.datamin = null;
+                if (axis.datamax == bottomSentry)
+                    axis.datamax = null;
+            });
+        }
+
+        function setupCanvases() {
+
+            // Make sure the placeholder is clear of everything except canvases
+            // from a previous plot in this container that we'll try to re-use.
+
+            placeholder.css("padding", 0) // padding messes up the positioning
+                .children(":not(.flot-base,.flot-overlay)").remove();
+
+            if (placeholder.css("position") == 'static')
+                placeholder.css("position", "relative"); // for positioning labels and overlay
+
+            surface = new Canvas("flot-base", placeholder);
+            overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
+
+            ctx = surface.context;
+            octx = overlay.context;
+
+            // define which element we're listening for events on
+            eventHolder = $(overlay.element).unbind();
+
+            // If we're re-using a plot object, shut down the old one
+
+            var existing = placeholder.data("plot");
+
+            if (existing) {
+                existing.shutdown();
+                overlay.clear();
+            }
+
+            // save in case we get replotted
+            placeholder.data("plot", plot);
+        }
+
+        function bindEvents() {
+            // bind events
+            if (options.grid.hoverable) {
+                eventHolder.mousemove(onMouseMove);
+
+                // Use bind, rather than .mouseleave, because we officially
+                // still support jQuery 1.2.6, which doesn't define a shortcut
+                // for mouseenter or mouseleave.  This was a bug/oversight that
+                // was fixed somewhere around 1.3.x.  We can return to using
+                // .mouseleave when we drop support for 1.2.6.
+
+                eventHolder.bind("mouseleave", onMouseLeave);
+            }
+
+            if (options.grid.clickable)
+                eventHolder.click(onClick);
+
+            executeHooks(hooks.bindEvents, [eventHolder]);
+        }
+
+        function shutdown() {
+            if (redrawTimeout)
+                clearTimeout(redrawTimeout);
+
+            eventHolder.unbind("mousemove", onMouseMove);
+            eventHolder.unbind("mouseleave", onMouseLeave);
+            eventHolder.unbind("click", onClick);
+
+            executeHooks(hooks.shutdown, [eventHolder]);
+        }
+
+        function setTransformationHelpers(axis) {
+            // set helper functions on the axis, assumes plot area
+            // has been computed already
+
+            function identity(x) { return x; }
+
+            var s, m, t = axis.options.transform || identity,
+                it = axis.options.inverseTransform;
+
+            // precompute how much the axis is scaling a point
+            // in canvas space
+            if (axis.direction == "x") {
+                s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
+                m = Math.min(t(axis.max), t(axis.min));
+            }
+            else {
+                s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
+                s = -s;
+                m = Math.max(t(axis.max), t(axis.min));
+            }
+
+            // data point to canvas coordinate
+            if (t == identity) // slight optimization
+                axis.p2c = function (p) { return (p - m) * s; };
+            else
+                axis.p2c = function (p) { return (t(p) - m) * s; };
+            // canvas coordinate to data point
+            if (!it)
+                axis.c2p = function (c) { return m + c / s; };
+            else
+                axis.c2p = function (c) { return it(m + c / s); };
+        }
+
+        function measureTickLabels(axis) {
+
+            var opts = axis.options,
+                ticks = axis.ticks || [],
+                labelWidth = opts.labelWidth || 0,
+                labelHeight = opts.labelHeight || 0,
+                maxWidth = labelWidth || axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null;
+                legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
+                layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
+                font = opts.font || "flot-tick-label tickLabel";
+
+            for (var i = 0; i < ticks.length; ++i) {
+
+                var t = ticks[i];
+
+                if (!t.label)
+                    continue;
+
+                var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
+
+                labelWidth = Math.max(labelWidth, info.width);
+                labelHeight = Math.max(labelHeight, info.height);
+            }
+
+            axis.labelWidth = opts.labelWidth || labelWidth;
+            axis.labelHeight = opts.labelHeight || labelHeight;
+        }
+
+        function allocateAxisBoxFirstPhase(axis) {
+            // find the bounding box of the axis by looking at label
+            // widths/heights and ticks, make room by diminishing the
+            // plotOffset; this first phase only looks at one
+            // dimension per axis, the other dimension depends on the
+            // other axes so will have to wait
+
+            var lw = axis.labelWidth,
+                lh = axis.labelHeight,
+                pos = axis.options.position,
+                tickLength = axis.options.tickLength,
+                axisMargin = options.grid.axisMargin,
+                padding = options.grid.labelMargin,
+                all = axis.direction == "x" ? xaxes : yaxes,
+                index, innermost;
+
+            // determine axis margin
+            var samePosition = $.grep(all, function (a) {
+                return a && a.options.position == pos && a.reserveSpace;
+            });
+            if ($.inArray(axis, samePosition) == samePosition.length - 1)
+                axisMargin = 0; // outermost
+
+            // determine tick length - if we're innermost, we can use "full"
+            if (tickLength == null) {
+                var sameDirection = $.grep(all, function (a) {
+                    return a && a.reserveSpace;
+                });
+
+                innermost = $.inArray(axis, sameDirection) == 0;
+                if (innermost)
+                    tickLength = "full";
+                else
+                    tickLength = 5;
+            }
+
+            if (!isNaN(+tickLength))
+                padding += +tickLength;
+
+            // compute box
+            if (axis.direction == "x") {
+                lh += padding;
+
+                if (pos == "bottom") {
+                    plotOffset.bottom += lh + axisMargin;
+                    axis.box = { top: surface.height - plotOffset.bottom, height: lh };
+                }
+                else {
+                    axis.box = { top: plotOffset.top + axisMargin, height: lh };
+                    plotOffset.top += lh + axisMargin;
+                }
+            }
+            else {
+                lw += padding;
+
+                if (pos == "left") {
+                    axis.box = { left: plotOffset.left + axisMargin, width: lw };
+                    plotOffset.left += lw + axisMargin;
+                }
+                else {
+                    plotOffset.right += lw + axisMargin;
+                    axis.box = { left: surface.width - plotOffset.right, width: lw };
+                }
+            }
+
+             // save for future reference
+            axis.position = pos;
+            axis.tickLength = tickLength;
+            axis.box.padding = padding;
+            axis.innermost = innermost;
+        }
+
+        function allocateAxisBoxSecondPhase(axis) {
+            // now that all axis boxes have been placed in one
+            // dimension, we can set the remaining dimension coordinates
+            if (axis.direction == "x") {
+                axis.box.left = plotOffset.left - axis.labelWidth / 2;
+                axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
+            }
+            else {
+                axis.box.top = plotOffset.top - axis.labelHeight / 2;
+                axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
+            }
+        }
+
+        function adjustLayoutForThingsStickingOut() {
+            // possibly adjust plot offset to ensure everything stays
+            // inside the canvas and isn't clipped off
+
+            var minMargin = options.grid.minBorderMargin,
+                margins = { x: 0, y: 0 }, i, axis;
+
+            // check stuff from the plot (FIXME: this should just read
+            // a value from the series, otherwise it's impossible to
+            // customize)
+            if (minMargin == null) {
+                minMargin = 0;
+                for (i = 0; i < series.length; ++i)
+                    minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
+            }
+
+            margins.x = margins.y = Math.ceil(minMargin);
+
+            // check axis labels, note we don't check the actual
+            // labels but instead use the overall width/height to not
+            // jump as much around with replots
+            $.each(allAxes(), function (_, axis) {
+                var dir = axis.direction;
+                if (axis.reserveSpace)
+                    margins[dir] = Math.ceil(Math.max(margins[dir], (dir == "x" ? axis.labelWidth : axis.labelHeight) / 2));
+            });
+
+            plotOffset.left = Math.max(margins.x, plotOffset.left);
+            plotOffset.right = Math.max(margins.x, plotOffset.right);
+            plotOffset.top = Math.max(margins.y, plotOffset.top);
+            plotOffset.bottom = Math.max(margins.y, plotOffset.bottom);
+        }
+
+        function setupGrid() {
+            var i, axes = allAxes(), showGrid = options.grid.show;
+
+            // Initialize the plot's offset from the edge of the canvas
+
+            for (var a in plotOffset) {
+                var margin = options.grid.margin || 0;
+                plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
+            }
+
+            executeHooks(hooks.processOffset, [plotOffset]);
+
+            // If the grid is visible, add its border width to the offset
+
+            for (var a in plotOffset) {
+                if(typeof(options.grid.borderWidth) == "object") {
+                    plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
+                }
+                else {
+                    plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
+                }
+            }
+
+            // init axes
+            $.each(axes, function (_, axis) {
+                axis.show = axis.options.show;
+                if (axis.show == null)
+                    axis.show = axis.used; // by default an axis is visible if it's got data
+
+                axis.reserveSpace = axis.show || axis.options.reserveSpace;
+
+                setRange(axis);
+            });
+
+            if (showGrid) {
+
+                var allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; });
+
+                $.each(allocatedAxes, function (_, axis) {
+                    // make the ticks
+                    setupTickGeneration(axis);
+                    setTicks(axis);
+                    snapRangeToTicks(axis, axis.ticks);
+                    // find labelWidth/Height for axis
+                    measureTickLabels(axis);
+                });
+
+                // with all dimensions calculated, we can compute the
+                // axis bounding boxes, start from the outside
+                // (reverse order)
+                for (i = allocatedAxes.length - 1; i >= 0; --i)
+                    allocateAxisBoxFirstPhase(allocatedAxes[i]);
+
+                // make sure we've got enough space for things that
+                // might stick out
+                adjustLayoutForThingsStickingOut();
+
+                $.each(allocatedAxes, function (_, axis) {
+                    allocateAxisBoxSecondPhase(axis);
+                });
+            }
+
+            plotWidth = surface.width - plotOffset.left - plotOffset.right;
+            plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
+
+            // now we got the proper plot dimensions, we can compute the scaling
+            $.each(axes, function (_, axis) {
+                setTransformationHelpers(axis);
+            });
+
+            if (showGrid) {
+                drawAxisLabels();
+            }
+
+            insertLegend();
+        }
+
+        function setRange(axis) {
+            var opts = axis.options,
+                min = +(opts.min != null ? opts.min : axis.datamin),
+                max = +(opts.max != null ? opts.max : axis.datamax),
+                delta = max - min;
+
+            if (delta == 0.0) {
+                // degenerate case
+                var widen = max == 0 ? 1 : 0.01;
+
+                if (opts.min == null)
+                    min -= widen;
+                // always widen max if we couldn't widen min to ensure we
+                // don't fall into min == max which doesn't work
+                if (opts.max == null || opts.min != null)
+                    max += widen;
+            }
+            else {
+                // consider autoscaling
+                var margin = opts.autoscaleMargin;
+                if (margin != null) {
+                    if (opts.min == null) {
+                        min -= delta * margin;
+                        // make sure we don't go below zero if all values
+                        // are positive
+                        if (min < 0 && axis.datamin != null && axis.datamin >= 0)
+                            min = 0;
+                    }
+                    if (opts.max == null) {
+                        max += delta * margin;
+                        if (max > 0 && axis.datamax != null && axis.datamax <= 0)
+                            max = 0;
+                    }
+                }
+            }
+            axis.min = min;
+            axis.max = max;
+        }
+
+        function setupTickGeneration(axis) {
+            var opts = axis.options;
+
+            // estimate number of ticks
+            var noTicks;
+            if (typeof opts.ticks == "number" && opts.ticks > 0)
+                noTicks = opts.ticks;
+            else
+                // heuristic based on the model a*sqrt(x) fitted to
+                // some data points that seemed reasonable
+                noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
+
+            var delta = (axis.max - axis.min) / noTicks,
+                dec = -Math.floor(Math.log(delta) / Math.LN10),
+                maxDec = opts.tickDecimals;
+
+            if (maxDec != null && dec > maxDec) {
+                dec = maxDec;
+            }
+
+            var magn = Math.pow(10, -dec),
+                norm = delta / magn, // norm is between 1.0 and 10.0
+                size;
+
+            if (norm < 1.5) {
+                size = 1;
+            } else if (norm < 3) {
+                size = 2;
+                // special case for 2.5, requires an extra decimal
+                if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
+                    size = 2.5;
+                    ++dec;
+                }
+            } else if (norm < 7.5) {
+                size = 5;
+            } else {
+                size = 10;
+            }
+
+            size *= magn;
+
+            if (opts.minTickSize != null && size < opts.minTickSize) {
+                size = opts.minTickSize;
+            }
+
+            axis.delta = delta;
+            axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
+            axis.tickSize = opts.tickSize || size;
+
+            // Time mode was moved to a plug-in in 0.8, but since so many people use this
+            // we'll add an especially friendly make sure they remembered to include it.
+
+            if (opts.mode == "time" && !axis.tickGenerator) {
+                throw new Error("Time mode requires the flot.time plugin.");
+            }
+
+            // Flot supports base-10 axes; any other mode else is handled by a plug-in,
+            // like flot.time.js.
+
+            if (!axis.tickGenerator) {
+
+                axis.tickGenerator = function (axis) {
+
+                    var ticks = [],
+                        start = floorInBase(axis.min, axis.tickSize),
+                        i = 0,
+                        v = Number.NaN,
+                        prev;
+
+                    do {
+                        prev = v;
+                        v = start + i * axis.tickSize;
+                        ticks.push(v);
+                        ++i;
+                    } while (v < axis.max && v != prev);
+                    return ticks;
+                };
+
+				axis.tickFormatter = function (value, axis) {
+
+					var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
+					var formatted = "" + Math.round(value * factor) / factor;
+
+					// If tickDecimals was specified, ensure that we have exactly that
+					// much precision; otherwise default to the value's own precision.
+
+					if (axis.tickDecimals != null) {
+						var decimal = formatted.indexOf(".");
+						var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
+						if (precision < axis.tickDecimals) {
+							return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
+						}
+					}
+
+                    return formatted;
+                };
+            }
+
+            if ($.isFunction(opts.tickFormatter))
+                axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
+
+            if (opts.alignTicksWithAxis != null) {
+                var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
+                if (otherAxis && otherAxis.used && otherAxis != axis) {
+                    // consider snapping min/max to outermost nice ticks
+                    var niceTicks = axis.tickGenerator(axis);
+                    if (niceTicks.length > 0) {
+                        if (opts.min == null)
+                            axis.min = Math.min(axis.min, niceTicks[0]);
+                        if (opts.max == null && niceTicks.length > 1)
+                            axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
+                    }
+
+                    axis.tickGenerator = function (axis) {
+                        // copy ticks, scaled to this axis
+                        var ticks = [], v, i;
+                        for (i = 0; i < otherAxis.ticks.length; ++i) {
+                            v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
+                            v = axis.min + v * (axis.max - axis.min);
+                            ticks.push(v);
+                        }
+                        return ticks;
+                    };
+
+                    // we might need an extra decimal since forced
+                    // ticks don't necessarily fit naturally
+                    if (!axis.mode && opts.tickDecimals == null) {
+                        var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
+                            ts = axis.tickGenerator(axis);
+
+                        // only proceed if the tick interval rounded
+                        // with an extra decimal doesn't give us a
+                        // zero at end
+                        if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
+                            axis.tickDecimals = extraDec;
+                    }
+                }
+            }
+        }
+
+        function setTicks(axis) {
+            var oticks = axis.options.ticks, ticks = [];
+            if (oticks == null || (typeof oticks == "number" && oticks > 0))
+                ticks = axis.tickGenerator(axis);
+            else if (oticks) {
+                if ($.isFunction(oticks))
+                    // generate the ticks
+                    ticks = oticks(axis);
+                else
+                    ticks = oticks;
+            }
+
+            // clean up/labelify the supplied ticks, copy them over
+            var i, v;
+            axis.ticks = [];
+            for (i = 0; i < ticks.length; ++i) {
+                var label = null;
+                var t = ticks[i];
+                if (typeof t == "object") {
+                    v = +t[0];
+                    if (t.length > 1)
+                        label = t[1];
+                }
+                else
+                    v = +t;
+                if (label == null)
+                    label = axis.tickFormatter(v, axis);
+                if (!isNaN(v))
+                    axis.ticks.push({ v: v, label: label });
+            }
+        }
+
+        function snapRangeToTicks(axis, ticks) {
+            if (axis.options.autoscaleMargin && ticks.length > 0) {
+                // snap to ticks
+                if (axis.options.min == null)
+                    axis.min = Math.min(axis.min, ticks[0].v);
+                if (axis.options.max == null && ticks.length > 1)
+                    axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
+            }
+        }
+
+        function draw() {
+
+            surface.clear();
+
+            executeHooks(hooks.drawBackground, [ctx]);
+
+            var grid = options.grid;
+
+            // draw background, if any
+            if (grid.show && grid.backgroundColor)
+                drawBackground();
+
+            if (grid.show && !grid.aboveData) {
+                drawGrid();
+            }
+
+            for (var i = 0; i < series.length; ++i) {
+                executeHooks(hooks.drawSeries, [ctx, series[i]]);
+                drawSeries(series[i]);
+            }
+
+            executeHooks(hooks.draw, [ctx]);
+
+            if (grid.show && grid.aboveData) {
+                drawGrid();
+            }
+
+            surface.render();
+
+            // A draw implies that either the axes or data have changed, so we
+            // should probably update the overlay highlights as well.
+
+            triggerRedrawOverlay();
+        }
+
+        function extractRange(ranges, coord) {
+            var axis, from, to, key, axes = allAxes();
+
+            for (var i = 0; i < axes.length; ++i) {
+                axis = axes[i];
+                if (axis.direction == coord) {
+                    key = coord + axis.n + "axis";
+                    if (!ranges[key] && axis.n == 1)
+                        key = coord + "axis"; // support x1axis as xaxis
+                    if (ranges[key]) {
+                        from = ranges[key].from;
+                        to = ranges[key].to;
+                        break;
+                    }
+                }
+            }
+
+            // backwards-compat stuff - to be removed in future
+            if (!ranges[key]) {
+                axis = coord == "x" ? xaxes[0] : yaxes[0];
+                from = ranges[coord + "1"];
+                to = ranges[coord + "2"];
+            }
+
+            // auto-reverse as an added bonus
+            if (from != null && to != null && from > to) {
+                var tmp = from;
+                from = to;
+                to = tmp;
+            }
+
+            return { from: from, to: to, axis: axis };
+        }
+
+        function drawBackground() {
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
+            ctx.fillRect(0, 0, plotWidth, plotHeight);
+            ctx.restore();
+        }
+
+        function drawGrid() {
+            var i, axes, bw, bc;
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            // draw markings
+            var markings = options.grid.markings;
+            if (markings) {
+                if ($.isFunction(markings)) {
+                    axes = plot.getAxes();
+                    // xmin etc. is backwards compatibility, to be
+                    // removed in the future
+                    axes.xmin = axes.xaxis.min;
+                    axes.xmax = axes.xaxis.max;
+                    axes.ymin = axes.yaxis.min;
+                    axes.ymax = axes.yaxis.max;
+
+                    markings = markings(axes);
+                }
+
+                for (i = 0; i < markings.length; ++i) {
+                    var m = markings[i],
+                        xrange = extractRange(m, "x"),
+                        yrange = extractRange(m, "y");
+
+                    // fill in missing
+                    if (xrange.from == null)
+                        xrange.from = xrange.axis.min;
+                    if (xrange.to == null)
+                        xrange.to = xrange.axis.max;
+                    if (yrange.from == null)
+                        yrange.from = yrange.axis.min;
+                    if (yrange.to == null)
+                        yrange.to = yrange.axis.max;
+
+                    // clip
+                    if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
+                        yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
+                        continue;
+
+                    xrange.from = Math.max(xrange.from, xrange.axis.min);
+                    xrange.to = Math.min(xrange.to, xrange.axis.max);
+                    yrange.from = Math.max(yrange.from, yrange.axis.min);
+                    yrange.to = Math.min(yrange.to, yrange.axis.max);
+
+                    if (xrange.from == xrange.to && yrange.from == yrange.to)
+                        continue;
+
+                    // then draw
+                    xrange.from = xrange.axis.p2c(xrange.from);
+                    xrange.to = xrange.axis.p2c(xrange.to);
+                    yrange.from = yrange.axis.p2c(yrange.from);
+                    yrange.to = yrange.axis.p2c(yrange.to);
+
+                    if (xrange.from == xrange.to || yrange.from == yrange.to) {
+                        // draw line
+                        ctx.beginPath();
+                        ctx.strokeStyle = m.color || options.grid.markingsColor;
+                        ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth;
+                        ctx.moveTo(xrange.from, yrange.from);
+                        ctx.lineTo(xrange.to, yrange.to);
+                        ctx.stroke();
+                    }
+                    else {
+                        // fill area
+                        ctx.fillStyle = m.color || options.grid.markingsColor;
+                        ctx.fillRect(xrange.from, yrange.to,
+                                     xrange.to - xrange.from,
+                                     yrange.from - yrange.to);
+                    }
+                }
+            }
+
+            // draw the ticks
+            axes = allAxes();
+            bw = options.grid.borderWidth;
+
+            for (var j = 0; j < axes.length; ++j) {
+                var axis = axes[j], box = axis.box,
+                    t = axis.tickLength, x, y, xoff, yoff;
+                if (!axis.show || axis.ticks.length == 0)
+                    continue;
+
+                ctx.lineWidth = 1;
+
+                // find the edges
+                if (axis.direction == "x") {
+                    x = 0;
+                    if (t == "full")
+                        y = (axis.position == "top" ? 0 : plotHeight);
+                    else
+                        y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
+                }
+                else {
+                    y = 0;
+                    if (t == "full")
+                        x = (axis.position == "left" ? 0 : plotWidth);
+                    else
+                        x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
+                }
+
+                // draw tick bar
+                if (!axis.innermost) {
+                    ctx.strokeStyle = axis.options.color;
+                    ctx.beginPath();
+                    xoff = yoff = 0;
+                    if (axis.direction == "x")
+                        xoff = plotWidth + 1;
+                    else
+                        yoff = plotHeight + 1;
+
+                    if (ctx.lineWidth == 1) {
+                        if (axis.direction == "x") {
+                            y = Math.floor(y) + 0.5;
+                        } else {
+                            x = Math.floor(x) + 0.5;
+                        }
+                    }
+
+                    ctx.moveTo(x, y);
+                    ctx.lineTo(x + xoff, y + yoff);
+                    ctx.stroke();
+                }
+
+                // draw ticks
+
+                ctx.strokeStyle = axis.options.tickColor;
+
+                ctx.beginPath();
+                for (i = 0; i < axis.ticks.length; ++i) {
+                    var v = axis.ticks[i].v;
+
+                    xoff = yoff = 0;
+
+                    if (isNaN(v) || v < axis.min || v > axis.max
+                        // skip those lying on the axes if we got a border
+                        || (t == "full"
+                            && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
+                            && (v == axis.min || v == axis.max)))
+                        continue;
+
+                    if (axis.direction == "x") {
+                        x = axis.p2c(v);
+                        yoff = t == "full" ? -plotHeight : t;
+
+                        if (axis.position == "top")
+                            yoff = -yoff;
+                    }
+                    else {
+                        y = axis.p2c(v);
+                        xoff = t == "full" ? -plotWidth : t;
+
+                        if (axis.position == "left")
+                            xoff = -xoff;
+                    }
+
+                    if (ctx.lineWidth == 1) {
+                        if (axis.direction == "x")
+                            x = Math.floor(x) + 0.5;
+                        else
+                            y = Math.floor(y) + 0.5;
+                    }
+
+                    ctx.moveTo(x, y);
+                    ctx.lineTo(x + xoff, y + yoff);
+                }
+
+                ctx.stroke();
+            }
+
+
+            // draw border
+            if (bw) {
+                // If either borderWidth or borderColor is an object, then draw the border
+                // line by line instead of as one rectangle
+                bc = options.grid.borderColor;
+                if(typeof bw == "object" || typeof bc == "object") {
+                    if (typeof bw !== "object") {
+                        bw = {top: bw, right: bw, bottom: bw, left: bw};
+                    }
+                    if (typeof bc !== "object") {
+                        bc = {top: bc, right: bc, bottom: bc, left: bc};
+                    }
+
+                    if (bw.top > 0) {
+                        ctx.strokeStyle = bc.top;
+                        ctx.lineWidth = bw.top;
+                        ctx.beginPath();
+                        ctx.moveTo(0 - bw.left, 0 - bw.top/2);
+                        ctx.lineTo(plotWidth, 0 - bw.top/2);
+                        ctx.stroke();
+                    }
+
+                    if (bw.right > 0) {
+                        ctx.strokeStyle = bc.right;
+                        ctx.lineWidth = bw.right;
+                        ctx.beginPath();
+                        ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
+                        ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
+                        ctx.stroke();
+                    }
+
+                    if (bw.bottom > 0) {
+                        ctx.strokeStyle = bc.bottom;
+                        ctx.lineWidth = bw.bottom;
+                        ctx.beginPath();
+                        ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
+                        ctx.lineTo(0, plotHeight + bw.bottom / 2);
+                        ctx.stroke();
+                    }
+
+                    if (bw.left > 0) {
+                        ctx.strokeStyle = bc.left;
+                        ctx.lineWidth = bw.left;
+                        ctx.beginPath();
+                        ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
+                        ctx.lineTo(0- bw.left/2, 0);
+                        ctx.stroke();
+                    }
+                }
+                else {
+                    ctx.lineWidth = bw;
+                    ctx.strokeStyle = options.grid.borderColor;
+                    ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
+                }
+            }
+
+            ctx.restore();
+        }
+
+        function drawAxisLabels() {
+
+            $.each(allAxes(), function (_, axis) {
+                if (!axis.show || axis.ticks.length == 0)
+                    return;
+
+                var box = axis.box,
+                    legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
+                    layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
+                    font = axis.options.font || "flot-tick-label tickLabel",
+                    tick, x, y, halign, valign;
+
+                surface.removeText(layer);
+
+                for (var i = 0; i < axis.ticks.length; ++i) {
+
+                    tick = axis.ticks[i];
+                    if (!tick.label || tick.v < axis.min || tick.v > axis.max)
+                        continue;
+
+                    if (axis.direction == "x") {
+                        halign = "center";
+                        x = plotOffset.left + axis.p2c(tick.v);
+                        if (axis.position == "bottom") {
+                            y = box.top + box.padding;
+                        } else {
+                            y = box.top + box.height - box.padding;
+                            valign = "bottom";
+                        }
+                    } else {
+                        valign = "middle";
+                        y = plotOffset.top + axis.p2c(tick.v);
+                        if (axis.position == "left") {
+                            x = box.left + box.width - box.padding;
+                            halign = "right";
+                        } else {
+                            x = box.left + box.padding;
+                        }
+                    }
+
+                    surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
+                }
+            });
+        }
+
+        function drawSeries(series) {
+            if (series.lines.show)
+                drawSeriesLines(series);
+            if (series.bars.show)
+                drawSeriesBars(series);
+            if (series.points.show)
+                drawSeriesPoints(series);
+        }
+
+        function drawSeriesLines(series) {
+            function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
+                var points = datapoints.points,
+                    ps = datapoints.pointsize,
+                    prevx = null, prevy = null;
+
+                ctx.beginPath();
+                for (var i = ps; i < points.length; i += ps) {
+                    var x1 = points[i - ps], y1 = points[i - ps + 1],
+                        x2 = points[i], y2 = points[i + 1];
+
+                    if (x1 == null || x2 == null)
+                        continue;
+
+                    // clip with ymin
+                    if (y1 <= y2 && y1 < axisy.min) {
+                        if (y2 < axisy.min)
+                            continue;   // line segment is outside
+                        // compute new intersection point
+                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.min;
+                    }
+                    else if (y2 <= y1 && y2 < axisy.min) {
+                        if (y1 < axisy.min)
+                            continue;
+                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.min;
+                    }
+
+                    // clip with ymax
+                    if (y1 >= y2 && y1 > axisy.max) {
+                        if (y2 > axisy.max)
+                            continue;
+                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.max;
+                    }
+                    else if (y2 >= y1 && y2 > axisy.max) {
+                        if (y1 > axisy.max)
+                            continue;
+                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.max;
+                    }
+
+                    // clip with xmin
+                    if (x1 <= x2 && x1 < axisx.min) {
+                        if (x2 < axisx.min)
+                            continue;
+                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.min;
+                    }
+                    else if (x2 <= x1 && x2 < axisx.min) {
+                        if (x1 < axisx.min)
+                            continue;
+                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.min;
+                    }
+
+                    // clip with xmax
+                    if (x1 >= x2 && x1 > axisx.max) {
+                        if (x2 > axisx.max)
+                            continue;
+                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.max;
+                    }
+                    else if (x2 >= x1 && x2 > axisx.max) {
+                        if (x1 > axisx.max)
+                            continue;
+                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.max;
+                    }
+
+                    if (x1 != prevx || y1 != prevy)
+                        ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
+
+                    prevx = x2;
+                    prevy = y2;
+                    ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
+                }
+                ctx.stroke();
+            }
+
+            function plotLineArea(datapoints, axisx, axisy) {
+                var points = datapoints.points,
+                    ps = datapoints.pointsize,
+                    bottom = Math.min(Math.max(0, axisy.min), axisy.max),
+                    i = 0, top, areaOpen = false,
+                    ypos = 1, segmentStart = 0, segmentEnd = 0;
+
+                // we process each segment in two turns, first forward
+                // direction to sketch out top, then once we hit the
+                // end we go backwards to sketch the bottom
+                while (true) {
+                    if (ps > 0 && i > points.length + ps)
+                        break;
+
+                    i += ps; // ps is negative if going backwards
+
+                    var x1 = points[i - ps],
+                        y1 = points[i - ps + ypos],
+                        x2 = points[i], y2 = points[i + ypos];
+
+                    if (areaOpen) {
+                        if (ps > 0 && x1 != null && x2 == null) {
+                            // at turning point
+                            segmentEnd = i;
+                            ps = -ps;
+                            ypos = 2;
+                            continue;
+                        }
+
+                        if (ps < 0 && i == segmentStart + ps) {
+                            // done with the reverse sweep
+                            ctx.fill();
+                            areaOpen = false;
+                            ps = -ps;
+                            ypos = 1;
+                            i = segmentStart = segmentEnd + ps;
+                            continue;
+                        }
+                    }
+
+                    if (x1 == null || x2 == null)
+                        continue;
+
+                    // clip x values
+
+                    // clip with xmin
+                    if (x1 <= x2 && x1 < axisx.min) {
+                        if (x2 < axisx.min)
+                            continue;
+                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.min;
+                    }
+                    else if (x2 <= x1 && x2 < axisx.min) {
+                        if (x1 < axisx.min)
+                            continue;
+                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.min;
+                    }
+
+                    // clip with xmax
+                    if (x1 >= x2 && x1 > axisx.max) {
+                        if (x2 > axisx.max)
+                            continue;
+                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.max;
+                    }
+                    else if (x2 >= x1 && x2 > axisx.max) {
+                        if (x1 > axisx.max)
+                            continue;
+                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.max;
+                    }
+
+                    if (!areaOpen) {
+                        // open area
+                        ctx.beginPath();
+                        ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
+                        areaOpen = true;
+                    }
+
+                    // now first check the case where both is outside
+                    if (y1 >= axisy.max && y2 >= axisy.max) {
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
+                        continue;
+                    }
+                    else if (y1 <= axisy.min && y2 <= axisy.min) {
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
+                        continue;
+                    }
+
+                    // else it's a bit more complicated, there might
+                    // be a flat maxed out rectangle first, then a
+                    // triangular cutout or reverse; to find these
+                    // keep track of the current x values
+                    var x1old = x1, x2old = x2;
+
+                    // clip the y values, without shortcutting, we
+                    // go through all cases in turn
+
+                    // clip with ymin
+                    if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
+                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.min;
+                    }
+                    else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
+                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.min;
+                    }
+
+                    // clip with ymax
+                    if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
+                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.max;
+                    }
+                    else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
+                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.max;
+                    }
+
+                    // if the x value was changed we got a rectangle
+                    // to fill
+                    if (x1 != x1old) {
+                        ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
+                        // it goes to (x1, y1), but we fill that below
+                    }
+
+                    // fill triangular section, this sometimes result
+                    // in redundant points if (x1, y1) hasn't changed
+                    // from previous line to, but we just ignore that
+                    ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
+                    ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
+
+                    // fill the other rectangle if it's there
+                    if (x2 != x2old) {
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
+                        ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
+                    }
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+            ctx.lineJoin = "round";
+
+            var lw = series.lines.lineWidth,
+                sw = series.shadowSize;
+            // FIXME: consider another form of shadow when filling is turned on
+            if (lw > 0 && sw > 0) {
+                // draw shadow as a thick and thin line with transparency
+                ctx.lineWidth = sw;
+                ctx.strokeStyle = "rgba(0,0,0,0.1)";
+                // position shadow at angle from the mid of line
+                var angle = Math.PI/18;
+                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
+                ctx.lineWidth = sw/2;
+                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
+            }
+
+            ctx.lineWidth = lw;
+            ctx.strokeStyle = series.color;
+            var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
+            if (fillStyle) {
+                ctx.fillStyle = fillStyle;
+                plotLineArea(series.datapoints, series.xaxis, series.yaxis);
+            }
+
+            if (lw > 0)
+                plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function drawSeriesPoints(series) {
+            function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
+                var points = datapoints.points, ps = datapoints.pointsize;
+
+                for (var i = 0; i < points.length; i += ps) {
+                    var x = points[i], y = points[i + 1];
+                    if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
+                        continue;
+
+                    ctx.beginPath();
+                    x = axisx.p2c(x);
+                    y = axisy.p2c(y) + offset;
+                    if (symbol == "circle")
+                        ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
+                    else
+                        symbol(ctx, x, y, radius, shadow);
+                    ctx.closePath();
+
+                    if (fillStyle) {
+                        ctx.fillStyle = fillStyle;
+                        ctx.fill();
+                    }
+                    ctx.stroke();
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            var lw = series.points.lineWidth,
+                sw = series.shadowSize,
+                radius = series.points.radius,
+                symbol = series.points.symbol;
+
+            // If the user sets the line width to 0, we change it to a very 
+            // small value. A line width of 0 seems to force the default of 1.
+            // Doing the conditional here allows the shadow setting to still be 
+            // optional even with a lineWidth of 0.
+
+            if( lw == 0 )
+                lw = 0.0001;
+
+            if (lw > 0 && sw > 0) {
+                // draw shadow in two steps
+                var w = sw / 2;
+                ctx.lineWidth = w;
+                ctx.strokeStyle = "rgba(0,0,0,0.1)";
+                plotPoints(series.datapoints, radius, null, w + w/2, true,
+                           series.xaxis, series.yaxis, symbol);
+
+                ctx.strokeStyle = "rgba(0,0,0,0.2)";
+                plotPoints(series.datapoints, radius, null, w/2, true,
+                           series.xaxis, series.yaxis, symbol);
+            }
+
+            ctx.lineWidth = lw;
+            ctx.strokeStyle = series.color;
+            plotPoints(series.datapoints, radius,
+                       getFillStyle(series.points, series.color), 0, false,
+                       series.xaxis, series.yaxis, symbol);
+            ctx.restore();
+        }
+
+        function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
+            var left, right, bottom, top,
+                drawLeft, drawRight, drawTop, drawBottom,
+                tmp;
+
+            // in horizontal mode, we start the bar from the left
+            // instead of from the bottom so it appears to be
+            // horizontal rather than vertical
+            if (horizontal) {
+                drawBottom = drawRight = drawTop = true;
+                drawLeft = false;
+                left = b;
+                right = x;
+                top = y + barLeft;
+                bottom = y + barRight;
+
+                // account for negative bars
+                if (right < left) {
+                    tmp = right;
+                    right = left;
+                    left = tmp;
+                    drawLeft = true;
+                    drawRight = false;
+                }
+            }
+            else {
+                drawLeft = drawRight = drawTop = true;
+                drawBottom = false;
+                left = x + barLeft;
+                right = x + barRight;
+                bottom = b;
+                top = y;
+
+                // account for negative bars
+                if (top < bottom) {
+                    tmp = top;
+                    top = bottom;
+                    bottom = tmp;
+                    drawBottom = true;
+                    drawTop = false;
+                }
+            }
+
+            // clip
+            if (right < axisx.min || left > axisx.max ||
+                top < axisy.min || bottom > axisy.max)
+                return;
+
+            if (left < axisx.min) {
+                left = axisx.min;
+                drawLeft = false;
+            }
+
+            if (right > axisx.max) {
+                right = axisx.max;
+                drawRight = false;
+            }
+
+            if (bottom < axisy.min) {
+                bottom = axisy.min;
+                drawBottom = false;
+            }
+
+            if (top > axisy.max) {
+                top = axisy.max;
+                drawTop = false;
+            }
+
+            left = axisx.p2c(left);
+            bottom = axisy.p2c(bottom);
+            right = axisx.p2c(right);
+            top = axisy.p2c(top);
+
+            // fill the bar
+            if (fillStyleCallback) {
+                c.beginPath();
+                c.moveTo(left, bottom);
+                c.lineTo(left, top);
+                c.lineTo(right, top);
+                c.lineTo(right, bottom);
+                c.fillStyle = fillStyleCallback(bottom, top);
+                c.fill();
+            }
+
+            // draw outline
+            if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
+                c.beginPath();
+
+                // FIXME: inline moveTo is buggy with excanvas
+                c.moveTo(left, bottom + offset);
+                if (drawLeft)
+                    c.lineTo(left, top + offset);
+                else
+                    c.moveTo(left, top + offset);
+                if (drawTop)
+                    c.lineTo(right, top + offset);
+                else
+                    c.moveTo(right, top + offset);
+                if (drawRight)
+                    c.lineTo(right, bottom + offset);
+                else
+                    c.moveTo(right, bottom + offset);
+                if (drawBottom)
+                    c.lineTo(left, bottom + offset);
+                else
+                    c.moveTo(left, bottom + offset);
+                c.stroke();
+            }
+        }
+
+        function drawSeriesBars(series) {
+            function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) {
+                var points = datapoints.points, ps = datapoints.pointsize;
+
+                for (var i = 0; i < points.length; i += ps) {
+                    if (points[i] == null)
+                        continue;
+                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            // FIXME: figure out a way to add shadows (for instance along the right edge)
+            ctx.lineWidth = series.bars.lineWidth;
+            ctx.strokeStyle = series.color;
+
+            var barLeft;
+
+            switch (series.bars.align) {
+                case "left":
+                    barLeft = 0;
+                    break;
+                case "right":
+                    barLeft = -series.bars.barWidth;
+                    break;
+                case "center":
+                    barLeft = -series.bars.barWidth / 2;
+                    break;
+                default:
+                    throw new Error("Invalid bar alignment: " + series.bars.align);
+            }
+
+            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
+            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function getFillStyle(filloptions, seriesColor, bottom, top) {
+            var fill = filloptions.fill;
+            if (!fill)
+                return null;
+
+            if (filloptions.fillColor)
+                return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
+
+            var c = $.color.parse(seriesColor);
+            c.a = typeof fill == "number" ? fill : 0.4;
+            c.normalize();
+            return c.toString();
+        }
+
+        function insertLegend() {
+
+            placeholder.find(".legend").remove();
+
+            if (!options.legend.show)
+                return;
+
+            var fragments = [], entries = [], rowStarted = false,
+                lf = options.legend.labelFormatter, s, label;
+
+            // Build a list of legend entries, with each having a label and a color
+
+            for (var i = 0; i < series.length; ++i) {
+                s = series[i];
+                if (s.label) {
+                    label = lf ? lf(s.label, s) : s.label;
+                    if (label) {
+                        entries.push({
+                            label: label,
+                            color: s.color
+                        });
+                    }
+                }
+            }
+
+            // Sort the legend using either the default or a custom comparator
+
+            if (options.legend.sorted) {
+                if ($.isFunction(options.legend.sorted)) {
+                    entries.sort(options.legend.sorted);
+                } else if (options.legend.sorted == "reverse") {
+                	entries.reverse();
+                } else {
+                    var ascending = options.legend.sorted != "descending";
+                    entries.sort(function(a, b) {
+                        return a.label == b.label ? 0 : (
+                            (a.label < b.label) != ascending ? 1 : -1   // Logical XOR
+                        );
+                    });
+                }
+            }
+
+            // Generate markup for the list of entries, in their final order
+
+            for (var i = 0; i < entries.length; ++i) {
+
+                var entry = entries[i];
+
+                if (i % options.legend.noColumns == 0) {
+                    if (rowStarted)
+                        fragments.push('</tr>');
+                    fragments.push('<tr>');
+                    rowStarted = true;
+                }
+
+                fragments.push(
+                    '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
+                    '<td class="legendLabel">' + entry.label + '</td>'
+                );
+            }
+
+            if (rowStarted)
+                fragments.push('</tr>');
+
+            if (fragments.length == 0)
+                return;
+
+            var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
+            if (options.legend.container != null)
+                $(options.legend.container).html(table);
+            else {
+                var pos = "",
+                    p = options.legend.position,
+                    m = options.legend.margin;
+                if (m[0] == null)
+                    m = [m, m];
+                if (p.charAt(0) == "n")
+                    pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
+                else if (p.charAt(0) == "s")
+                    pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
+                if (p.charAt(1) == "e")
+                    pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
+                else if (p.charAt(1) == "w")
+                    pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
+                var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
+                if (options.legend.backgroundOpacity != 0.0) {
+                    // put in the transparent background
+                    // separately to avoid blended labels and
+                    // label boxes
+                    var c = options.legend.backgroundColor;
+                    if (c == null) {
+                        c = options.grid.backgroundColor;
+                        if (c && typeof c == "string")
+                            c = $.color.parse(c);
+                        else
+                            c = $.color.extract(legend, 'background-color');
+                        c.a = 1;
+                        c = c.toString();
+                    }
+                    var div = legend.children();
+                    $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
+                }
+            }
+        }
+
+
+        // interactive features
+
+        var highlights = [],
+            redrawTimeout = null;
+
+        // returns the data item the mouse is over, or null if none is found
+        function findNearbyItem(mouseX, mouseY, seriesFilter) {
+            var maxDistance = options.grid.mouseActiveRadius,
+                smallestDistance = maxDistance * maxDistance + 1,
+                item = null, foundPoint = false, i, j, ps;
+
+            for (i = series.length - 1; i >= 0; --i) {
+                if (!seriesFilter(series[i]))
+                    continue;
+
+                var s = series[i],
+                    axisx = s.xaxis,
+                    axisy = s.yaxis,
+                    points = s.datapoints.points,
+                    mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
+                    my = axisy.c2p(mouseY),
+                    maxx = maxDistance / axisx.scale,
+                    maxy = maxDistance / axisy.scale;
+
+                ps = s.datapoints.pointsize;
+                // with inverse transforms, we can't use the maxx/maxy
+                // optimization, sadly
+                if (axisx.options.inverseTransform)
+                    maxx = Number.MAX_VALUE;
+                if (axisy.options.inverseTransform)
+                    maxy = Number.MAX_VALUE;
+
+                if (s.lines.show || s.points.show) {
+                    for (j = 0; j < points.length; j += ps) {
+                        var x = points[j], y = points[j + 1];
+                        if (x == null)
+                            continue;
+
+                        // For points and lines, the cursor must be within a
+                        // certain distance to the data point
+                        if (x - mx > maxx || x - mx < -maxx ||
+                            y - my > maxy || y - my < -maxy)
+                            continue;
+
+                        // We have to calculate distances in pixels, not in
+                        // data units, because the scales of the axes may be different
+                        var dx = Math.abs(axisx.p2c(x) - mouseX),
+                            dy = Math.abs(axisy.p2c(y) - mouseY),
+                            dist = dx * dx + dy * dy; // we save the sqrt
+
+                        // use <= to ensure last point takes precedence
+                        // (last generally means on top of)
+                        if (dist < smallestDistance) {
+                            smallestDistance = dist;
+                            item = [i, j / ps];
+                        }
+                    }
+                }
+
+                if (s.bars.show && !item) { // no other point can be nearby
+                    var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2,
+                        barRight = barLeft + s.bars.barWidth;
+
+                    for (j = 0; j < points.length; j += ps) {
+                        var x = points[j], y = points[j + 1], b = points[j + 2];
+                        if (x == null)
+                            continue;
+
+                        // for a bar graph, the cursor must be inside the bar
+                        if (series[i].bars.horizontal ?
+                            (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
+                             my >= y + barLeft && my <= y + barRight) :
+                            (mx >= x + barLeft && mx <= x + barRight &&
+                             my >= Math.min(b, y) && my <= Math.max(b, y)))
+                                item = [i, j / ps];
+                    }
+                }
+            }
+
+            if (item) {
+                i = item[0];
+                j = item[1];
+                ps = series[i].datapoints.pointsize;
+
+                return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
+                         dataIndex: j,
+                         series: series[i],
+                         seriesIndex: i };
+            }
+
+            return null;
+        }
+
+        function onMouseMove(e) {
+            if (options.grid.hoverable)
+                triggerClickHoverEvent("plothover", e,
+                                       function (s) { return s["hoverable"] != false; });
+        }
+
+        function onMouseLeave(e) {
+            if (options.grid.hoverable)
+                triggerClickHoverEvent("plothover", e,
+                                       function (s) { return false; });
+        }
+
+        function onClick(e) {
+            triggerClickHoverEvent("plotclick", e,
+                                   function (s) { return s["clickable"] != false; });
+        }
+
+        // trigger click or hover event (they send the same parameters
+        // so we share their code)
+        function triggerClickHoverEvent(eventname, event, seriesFilter) {
+            var offset = eventHolder.offset(),
+                canvasX = event.pageX - offset.left - plotOffset.left,
+                canvasY = event.pageY - offset.top - plotOffset.top,
+            pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
+
+            pos.pageX = event.pageX;
+            pos.pageY = event.pageY;
+
+            var item = findNearbyItem(canvasX, canvasY, seriesFilter);
+
+            if (item) {
+                // fill in mouse pos for any listeners out there
+                item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
+                item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
+            }
+
+            if (options.grid.autoHighlight) {
+                // clear auto-highlights
+                for (var i = 0; i < highlights.length; ++i) {
+                    var h = highlights[i];
+                    if (h.auto == eventname &&
+                        !(item && h.series == item.series &&
+                          h.point[0] == item.datapoint[0] &&
+                          h.point[1] == item.datapoint[1]))
+                        unhighlight(h.series, h.point);
+                }
+
+                if (item)
+                    highlight(item.series, item.datapoint, eventname);
+            }
+
+            placeholder.trigger(eventname, [ pos, item ]);
+        }
+
+        function triggerRedrawOverlay() {
+            var t = options.interaction.redrawOverlayInterval;
+            if (t == -1) {      // skip event queue
+                drawOverlay();
+                return;
+            }
+
+            if (!redrawTimeout)
+                redrawTimeout = setTimeout(drawOverlay, t);
+        }
+
+        function drawOverlay() {
+            redrawTimeout = null;
+
+            // draw highlights
+            octx.save();
+            overlay.clear();
+            octx.translate(plotOffset.left, plotOffset.top);
+
+            var i, hi;
+            for (i = 0; i < highlights.length; ++i) {
+                hi = highlights[i];
+
+                if (hi.series.bars.show)
+                    drawBarHighlight(hi.series, hi.point);
+                else
+                    drawPointHighlight(hi.series, hi.point);
+            }
+            octx.restore();
+
+            executeHooks(hooks.drawOverlay, [octx]);
+        }
+
+        function highlight(s, point, auto) {
+            if (typeof s == "number")
+                s = series[s];
+
+            if (typeof point == "number") {
+                var ps = s.datapoints.pointsize;
+                point = s.datapoints.points.slice(ps * point, ps * (point + 1));
+            }
+
+            var i = indexOfHighlight(s, point);
+            if (i == -1) {
+                highlights.push({ series: s, point: point, auto: auto });
+
+                triggerRedrawOverlay();
+            }
+            else if (!auto)
+                highlights[i].auto = false;
+        }
+
+        function unhighlight(s, point) {
+            if (s == null && point == null) {
+                highlights = [];
+                triggerRedrawOverlay();
+                return;
+            }
+
+            if (typeof s == "number")
+                s = series[s];
+
+            if (typeof point == "number") {
+                var ps = s.datapoints.pointsize;
+                point = s.datapoints.points.slice(ps * point, ps * (point + 1));
+            }
+
+            var i = indexOfHighlight(s, point);
+            if (i != -1) {
+                highlights.splice(i, 1);
+
+                triggerRedrawOverlay();
+            }
+        }
+
+        function indexOfHighlight(s, p) {
+            for (var i = 0; i < highlights.length; ++i) {
+                var h = highlights[i];
+                if (h.series == s && h.point[0] == p[0]
+                    && h.point[1] == p[1])
+                    return i;
+            }
+            return -1;
+        }
+
+        function drawPointHighlight(series, point) {
+            var x = point[0], y = point[1],
+                axisx = series.xaxis, axisy = series.yaxis,
+                highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
+
+            if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
+                return;
+
+            var pointRadius = series.points.radius + series.points.lineWidth / 2;
+            octx.lineWidth = pointRadius;
+            octx.strokeStyle = highlightColor;
+            var radius = 1.5 * pointRadius;
+            x = axisx.p2c(x);
+            y = axisy.p2c(y);
+
+            octx.beginPath();
+            if (series.points.symbol == "circle")
+                octx.arc(x, y, radius, 0, 2 * Math.PI, false);
+            else
+                series.points.symbol(octx, x, y, radius, false);
+            octx.closePath();
+            octx.stroke();
+        }
+
+        function drawBarHighlight(series, point) {
+            var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
+                fillStyle = highlightColor,
+                barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2;
+
+            octx.lineWidth = series.bars.lineWidth;
+            octx.strokeStyle = highlightColor;
+
+            drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
+                    0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
+        }
+
+        function getColorOrGradient(spec, bottom, top, defaultColor) {
+            if (typeof spec == "string")
+                return spec;
+            else {
+                // assume this is a gradient spec; IE currently only
+                // supports a simple vertical gradient properly, so that's
+                // what we support too
+                var gradient = ctx.createLinearGradient(0, top, 0, bottom);
+
+                for (var i = 0, l = spec.colors.length; i < l; ++i) {
+                    var c = spec.colors[i];
+                    if (typeof c != "string") {
+                        var co = $.color.parse(defaultColor);
+                        if (c.brightness != null)
+                            co = co.scale('rgb', c.brightness);
+                        if (c.opacity != null)
+                            co.a *= c.opacity;
+                        c = co.toString();
+                    }
+                    gradient.addColorStop(i / (l - 1), c);
+                }
+
+                return gradient;
+            }
+        }
+    }
+
+    // Add the plot function to the top level of the jQuery object
+
+    $.plot = function(placeholder, data, options) {
+        //var t0 = new Date();
+        var plot = new Plot($(placeholder), data, options, $.plot.plugins);
+        //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
+        return plot;
+    };
+
+    $.plot.version = "0.8.1";
+
+    $.plot.plugins = [];
+
+    // Also add the plot function as a chainable property
+
+    $.fn.plot = function(data, options) {
+        return this.each(function() {
+            $.plot(this, data, options);
+        });
+    };
+
+    // round to nearby lower multiple of base
+    function floorInBase(n, base) {
+        return base * Math.floor(n / base);
+    }
+
+})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/jquery-2.0.3.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,8829 @@
+/*!
+ * jQuery JavaScript Library v2.0.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:30Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Support: IE9
+	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+	core_strundefined = typeof undefined,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	location = window.location,
+	document = window.document,
+	docElem = document.documentElement,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// [[Class]] -> type pairs
+	class2type = {},
+
+	// List of deleted data cache ids, so we can reuse them
+	core_deletedIds = [],
+
+	core_version = "2.0.3",
+
+	// Save a reference to some core methods
+	core_concat = core_deletedIds.concat,
+	core_push = core_deletedIds.push,
+	core_slice = core_deletedIds.slice,
+	core_indexOf = core_deletedIds.indexOf,
+	core_toString = class2type.toString,
+	core_hasOwn = class2type.hasOwnProperty,
+	core_trim = core_version.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+	// Used for splitting on whitespace
+	core_rnotwhite = /\S+/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	},
+
+	// The ready event handler and self cleanup method
+	completed = function() {
+		document.removeEventListener( "DOMContentLoaded", completed, false );
+		window.removeEventListener( "load", completed, false );
+		jQuery.ready();
+	};
+
+jQuery.fn = jQuery.prototype = {
+	// The current version of jQuery being used
+	jquery: core_version,
+
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+
+					// scripts is true for back-compat
+					jQuery.merge( this, jQuery.parseHTML(
+						match[1],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return core_slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	slice: function() {
+		return this.pushStack( core_slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray,
+
+	isWindow: function( obj ) {
+		return obj != null && obj === obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return String( obj );
+		}
+		// Support: Safari <= 5.1 (functionish RegExp)
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ core_toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	isPlainObject: function( obj ) {
+		// Not plain objects:
+		// - Any object or value whose internal [[Class]] property is not "[object Object]"
+		// - DOM nodes
+		// - window
+		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		// Support: Firefox <20
+		// The try/catch suppresses exceptions thrown when attempting to access
+		// the "constructor" property of certain host objects, ie. |window.location|
+		// https://bugzilla.mozilla.org/show_bug.cgi?id=814622
+		try {
+			if ( obj.constructor &&
+					!core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+				return false;
+			}
+		} catch ( e ) {
+			return false;
+		}
+
+		// If the function hasn't returned already, we're confident that
+		// |obj| is a plain object, created by {} or constructed with new Object
+		return true;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// keepScripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, keepScripts ) {
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			keepScripts = context;
+			context = false;
+		}
+		context = context || document;
+
+		var parsed = rsingleTag.exec( data ),
+			scripts = !keepScripts && [];
+
+		// Single tag
+		if ( parsed ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+		if ( scripts ) {
+			jQuery( scripts ).remove();
+		}
+
+		return jQuery.merge( [], parsed.childNodes );
+	},
+
+	parseJSON: JSON.parse,
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+
+		// Support: IE9
+		try {
+			tmp = new DOMParser();
+			xml = tmp.parseFromString( data , "text/xml" );
+		} catch ( e ) {
+			xml = undefined;
+		}
+
+		if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	globalEval: function( code ) {
+		var script,
+				indirect = eval;
+
+		code = jQuery.trim( code );
+
+		if ( code ) {
+			// If the code includes a valid, prologue position
+			// strict mode pragma, execute code by injecting a
+			// script tag into the document.
+			if ( code.indexOf("use strict") === 1 ) {
+				script = document.createElement("script");
+				script.text = code;
+				document.head.appendChild( script ).parentNode.removeChild( script );
+			} else {
+			// Otherwise, avoid the DOM node creation, insertion
+			// and removal by using an indirect global eval
+				indirect( code );
+			}
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var value,
+			i = 0,
+			length = obj.length,
+			isArray = isArraylike( obj );
+
+		if ( args ) {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	trim: function( text ) {
+		return text == null ? "" : core_trim.call( text );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArraylike( Object(arr) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				core_push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : core_indexOf.call( arr, elem, i );
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value,
+			i = 0,
+			length = elems.length,
+			isArray = isArraylike( elems ),
+			ret = [];
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return core_concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+		var i = 0,
+			length = elems.length,
+			bulk = key == null;
+
+		// Sets many values
+		if ( jQuery.type( key ) === "object" ) {
+			chainable = true;
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+			}
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			chainable = true;
+
+			if ( !jQuery.isFunction( value ) ) {
+				raw = true;
+			}
+
+			if ( bulk ) {
+				// Bulk operations run against the entire set
+				if ( raw ) {
+					fn.call( elems, value );
+					fn = null;
+
+				// ...except when executing function values
+				} else {
+					bulk = fn;
+					fn = function( elem, key, value ) {
+						return bulk.call( jQuery( elem ), value );
+					};
+				}
+			}
+
+			if ( fn ) {
+				for ( ; i < length; i++ ) {
+					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+				}
+			}
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: Date.now,
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations.
+	// Note: this method belongs to the css module but it's needed here for the support module.
+	// If support gets modularized, this method should be moved back to the css module.
+	swap: function( elem, options, callback, args ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.apply( elem, args || [] );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready );
+
+		} else {
+
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+	var length = obj.length,
+		type = jQuery.type( obj );
+
+	if ( jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	if ( obj.nodeType === 1 && length ) {
+		return true;
+	}
+
+	return type === "array" || type !== "function" &&
+		( length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.9.4-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-06-03
+ */
+(function( window, undefined ) {
+
+var i,
+	support,
+	cachedruns,
+	Expr,
+	getText,
+	isXML,
+	compile,
+	outermostContext,
+	sortInput,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + -(new Date()),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	hasDuplicate = false,
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	strundefined = typeof undefined,
+	MAX_NEGATIVE = 1 << 31,
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf if we can't use a native one
+	indexOf = arr.indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments quoted,
+	//   then not containing pseudos/brackets,
+	//   then attribute selectors/non-parenthetical expressions,
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rsibling = new RegExp( whitespace + "*[+~]" ),
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rescape = /'|\\/g,
+
+	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			// BMP codepoint
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	};
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var match, elem, m, nodeType,
+		// QSA vars
+		i, groups, old, nid, newContext, newSelector;
+
+	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+		setDocument( context );
+	}
+
+	context = context || document;
+	results = results || [];
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( documentIsHTML && !seed ) {
+
+		// Shortcuts
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, context.getElementsByTagName( selector ) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+				push.apply( results, context.getElementsByClassName( m ) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+			nid = old = expando;
+			newContext = context;
+			newSelector = nodeType === 9 && selector;
+
+			// qSA works strangely on Element-rooted queries
+			// We can work around this by specifying an extra ID on the root
+			// and working up from there (Thanks to Andrew Dupont for the technique)
+			// IE 8 doesn't work on object elements
+			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+				groups = tokenize( selector );
+
+				if ( (old = context.getAttribute("id")) ) {
+					nid = old.replace( rescape, "\\$&" );
+				} else {
+					context.setAttribute( "id", nid );
+				}
+				nid = "[id='" + nid + "'] ";
+
+				i = groups.length;
+				while ( i-- ) {
+					groups[i] = nid + toSelector( groups[i] );
+				}
+				newContext = rsibling.test( selector ) && context.parentNode || context;
+				newSelector = groups.join(",");
+			}
+
+			if ( newSelector ) {
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						context.removeAttribute("id");
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key += " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return !!fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( div.parentNode ) {
+			div.parentNode.removeChild( div );
+		}
+		// release memory in IE
+		div = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = attrs.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			( ~b.sourceIndex || MAX_NEGATIVE ) -
+			( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var doc = node ? node.ownerDocument || node : preferredDoc,
+		parent = doc.defaultView;
+
+	// If no document and documentElement is available, return
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Set our document
+	document = doc;
+	docElem = doc.documentElement;
+
+	// Support tests
+	documentIsHTML = !isXML( doc );
+
+	// Support: IE>8
+	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
+	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+	// IE6-8 do not support the defaultView property so parent will be undefined
+	if ( parent && parent.attachEvent && parent !== parent.top ) {
+		parent.attachEvent( "onbeforeunload", function() {
+			setDocument();
+		});
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+	support.attributes = assert(function( div ) {
+		div.className = "i";
+		return !div.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( div ) {
+		div.appendChild( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Check if getElementsByClassName can be trusted
+	support.getElementsByClassName = assert(function( div ) {
+		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+		// Support: Safari<4
+		// Catch class over-caching
+		div.firstChild.className = "i";
+		// Support: Opera<10
+		// Catch gEBCN failure to find non-leading classes
+		return div.getElementsByClassName("i").length === 2;
+	});
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( div ) {
+		docElem.appendChild( div ).id = expando;
+		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+				var m = context.getElementById( id );
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		// Support: IE6/7
+		// getElementById is not reliable as a find shortcut
+		delete Expr.find["ID"];
+
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== strundefined ) {
+				return context.getElementsByTagName( tag );
+			}
+		} :
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See http://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Support: Opera 10-12/IE8
+			// ^= $= *= and empty values
+			// Should not select anything
+			// Support: Windows 8 Native Apps
+			// The type attribute is restricted during .innerHTML assignment
+			var input = doc.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "t", "" );
+
+			if ( div.querySelectorAll("[t^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+		if ( compare ) {
+			// Disconnected nodes
+			if ( compare & 1 ||
+				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+				// Choose the first element that is related to our preferred document
+				if ( a === doc || contains(preferredDoc, a) ) {
+					return -1;
+				}
+				if ( b === doc || contains(preferredDoc, b) ) {
+					return 1;
+				}
+
+				// Maintain original order
+				return sortInput ?
+					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+					0;
+			}
+
+			return compare & 4 ? -1 : 1;
+		}
+
+		// Not directly comparable, sort on existence of method
+		return a.compareDocumentPosition ? -1 : 1;
+	} :
+	function( a, b ) {
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Parentless nodes are either documents or disconnected
+		} else if ( !aup || !bup ) {
+			return a === doc ? -1 :
+				b === doc ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch(e) {}
+	}
+
+	return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val === undefined ?
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null :
+		val;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (see #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[5] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] && match[4] !== undefined ) {
+				match[2] = match[4];
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, outerCache, node, diff, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+							// Seek `elem` from a previously-cached index
+							outerCache = parent[ expando ] || (parent[ expando ] = {});
+							cache = outerCache[ type ] || [];
+							nodeIndex = cache[0] === dirruns && cache[1];
+							diff = cache[0] === dirruns && cache[2];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						// Use previously-cached element index if available
+						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+							diff = cache[1];
+
+						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+						} else {
+							// Use the same loop as above to seek `elem` from the start
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+									// Cache the index of each encountered element
+									if ( useCache ) {
+										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+									}
+
+									if ( node === elem ) {
+										break;
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var data, cache, outerCache,
+				dirkey = dirruns + " " + doneName;
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+							if ( (data = cache[1]) === true || data === cachedruns ) {
+								return data === true;
+							}
+						} else {
+							cache = outerCache[ dir ] = [ dirkey ];
+							cache[1] = matcher( elem, context, xml ) || cachedruns;
+							if ( cache[1] === true ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	// A counter to specify which element is currently being matched
+	var matcherCachedRuns = 0,
+		bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = matcherCachedRuns;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++matcherCachedRuns;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector );
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					support.getById && context.nodeType === 9 && documentIsHTML &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+				if ( !context ) {
+					return results;
+				}
+				selector = selector.slice( tokens.shift().value.length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+			while ( i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( runescape, funescape ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && toSelector( tokens );
+						if ( !selector ) {
+							push.apply( results, seed );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+	// Should return 1, but returns 4 (following)
+	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+	div.innerHTML = "<a href='#'></a>";
+	return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+	div.innerHTML = "<input/>";
+	div.firstChild.setAttribute( "value", "" );
+	return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+	return div.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return (val = elem.getAttributeNode( name )) && val.specified ?
+				val.value :
+				elem[ name ] === true ? name.toLowerCase() : null;
+		}
+	});
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				firingLength = 0;
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( list && ( !fired || stack ) ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ](function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.done( newDefer.resolve )
+										.fail( newDefer.reject )
+										.progress( newDefer.notify );
+								} else {
+									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+								}
+							});
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[0] ] = function() {
+				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function( support ) {
+	var input = document.createElement("input"),
+		fragment = document.createDocumentFragment(),
+		div = document.createElement("div"),
+		select = document.createElement("select"),
+		opt = select.appendChild( document.createElement("option") );
+
+	// Finish early in limited environments
+	if ( !input.type ) {
+		return support;
+	}
+
+	input.type = "checkbox";
+
+	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+	// Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+	support.checkOn = input.value !== "";
+
+	// Must access the parent to make an option select properly
+	// Support: IE9, IE10
+	support.optSelected = opt.selected;
+
+	// Will be defined later
+	support.reliableMarginRight = true;
+	support.boxSizingReliable = true;
+	support.pixelPosition = false;
+
+	// Make sure checked status is properly cloned
+	// Support: IE9, IE10
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Check if an input maintains its value after becoming a radio
+	// Support: IE9, IE10
+	input = document.createElement("input");
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "checked", "t" );
+	input.setAttribute( "name", "t" );
+
+	fragment.appendChild( input );
+
+	// Support: Safari 5.1, Android 4.x, Android 2.3
+	// old WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: Firefox, Chrome, Safari
+	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+	support.focusinBubbles = "onfocusin" in window;
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, marginDiv,
+			// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
+			divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",
+			body = document.getElementsByTagName("body")[ 0 ];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+		// Check box-sizing and margin behavior.
+		body.appendChild( container ).appendChild( div );
+		div.innerHTML = "";
+		// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
+		div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%";
+
+		// Workaround failing boxSizing test due to offsetWidth returning wrong value
+		// with some non-1 values of body zoom, ticket #13543
+		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+			support.boxSizing = div.offsetWidth === 4;
+		});
+
+		// Use window.getComputedStyle because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Support: Android 2.3
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. (#3333)
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = div.appendChild( document.createElement("div") );
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		body.removeChild( container );
+	});
+
+	return support;
+})( {} );
+
+/*
+	Implementation Summary
+
+	1. Enforce API surface and semantic compatibility with 1.9.x branch
+	2. Improve the module's maintainability by reducing the storage
+		paths to a single mechanism.
+	3. Use the same single mechanism to support "private" and "user" data.
+	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+	5. Avoid exposing implementation details on user objects (eg. expando properties)
+	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var data_user, data_priv,
+	rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function Data() {
+	// Support: Android < 4,
+	// Old WebKit does not have Object.preventExtensions/freeze method,
+	// return new empty object instead with no [[set]] accessor
+	Object.defineProperty( this.cache = {}, 0, {
+		get: function() {
+			return {};
+		}
+	});
+
+	this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+
+Data.accepts = function( owner ) {
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType ?
+		owner.nodeType === 1 || owner.nodeType === 9 : true;
+};
+
+Data.prototype = {
+	key: function( owner ) {
+		// We can accept data for non-element nodes in modern browsers,
+		// but we should not, see #8335.
+		// Always return the key for a frozen object.
+		if ( !Data.accepts( owner ) ) {
+			return 0;
+		}
+
+		var descriptor = {},
+			// Check if the owner object already has a cache key
+			unlock = owner[ this.expando ];
+
+		// If not, create one
+		if ( !unlock ) {
+			unlock = Data.uid++;
+
+			// Secure it in a non-enumerable, non-writable property
+			try {
+				descriptor[ this.expando ] = { value: unlock };
+				Object.defineProperties( owner, descriptor );
+
+			// Support: Android < 4
+			// Fallback to a less secure definition
+			} catch ( e ) {
+				descriptor[ this.expando ] = unlock;
+				jQuery.extend( owner, descriptor );
+			}
+		}
+
+		// Ensure the cache object
+		if ( !this.cache[ unlock ] ) {
+			this.cache[ unlock ] = {};
+		}
+
+		return unlock;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			// There may be an unlock assigned to this node,
+			// if there is no entry for this "owner", create one inline
+			// and set the unlock as though an owner entry had always existed
+			unlock = this.key( owner ),
+			cache = this.cache[ unlock ];
+
+		// Handle: [ owner, key, value ] args
+		if ( typeof data === "string" ) {
+			cache[ data ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+			// Fresh assignments by object are shallow copied
+			if ( jQuery.isEmptyObject( cache ) ) {
+				jQuery.extend( this.cache[ unlock ], data );
+			// Otherwise, copy the properties one-by-one to the cache object
+			} else {
+				for ( prop in data ) {
+					cache[ prop ] = data[ prop ];
+				}
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		// Either a valid cache is found, or will be created.
+		// New caches will be created and the unlock returned,
+		// allowing direct access to the newly created
+		// empty data object. A valid owner object must be provided.
+		var cache = this.cache[ this.key( owner ) ];
+
+		return key === undefined ?
+			cache : cache[ key ];
+	},
+	access: function( owner, key, value ) {
+		var stored;
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				((key && typeof key === "string") && value === undefined) ) {
+
+			stored = this.get( owner, key );
+
+			return stored !== undefined ?
+				stored : this.get( owner, jQuery.camelCase(key) );
+		}
+
+		// [*]When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i, name, camel,
+			unlock = this.key( owner ),
+			cache = this.cache[ unlock ];
+
+		if ( key === undefined ) {
+			this.cache[ unlock ] = {};
+
+		} else {
+			// Support array or space separated string of keys
+			if ( jQuery.isArray( key ) ) {
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = key.concat( key.map( jQuery.camelCase ) );
+			} else {
+				camel = jQuery.camelCase( key );
+				// Try the string as a key before any manipulation
+				if ( key in cache ) {
+					name = [ key, camel ];
+				} else {
+					// If a key with the spaces exists, use it.
+					// Otherwise, create an array by matching non-whitespace
+					name = camel;
+					name = name in cache ?
+						[ name ] : ( name.match( core_rnotwhite ) || [] );
+				}
+			}
+
+			i = name.length;
+			while ( i-- ) {
+				delete cache[ name[ i ] ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		return !jQuery.isEmptyObject(
+			this.cache[ owner[ this.expando ] ] || {}
+		);
+	},
+	discard: function( owner ) {
+		if ( owner[ this.expando ] ) {
+			delete this.cache[ owner[ this.expando ] ];
+		}
+	}
+};
+
+// These may be used throughout the jQuery core codebase
+data_user = new Data();
+data_priv = new Data();
+
+
+jQuery.extend({
+	acceptData: Data.accepts,
+
+	hasData: function( elem ) {
+		return data_user.hasData( elem ) || data_priv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return data_user.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		data_user.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to data_priv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return data_priv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		data_priv.remove( elem, name );
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var attrs, name,
+			elem = this[ 0 ],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = data_user.get( elem );
+
+				if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+					attrs = elem.attributes;
+					for ( ; i < attrs.length; i++ ) {
+						name = attrs[ i ].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.slice(5) );
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					data_priv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				data_user.set( this, key );
+			});
+		}
+
+		return jQuery.access( this, function( value ) {
+			var data,
+				camelKey = jQuery.camelCase( key );
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+				// Attempt to get data from the cache
+				// with the key as-is
+				data = data_user.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to get data from the cache
+				// with the key camelized
+				data = data_user.get( elem, camelKey );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, camelKey, undefined );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each(function() {
+				// First, attempt to store a copy or reference of any
+				// data that might've been store with a camelCased key.
+				var data = data_user.get( this, camelKey );
+
+				// For HTML5 data-* attribute interop, we have to
+				// store property names with dashes in a camelCase form.
+				// This might not apply to all properties...*
+				data_user.set( this, camelKey, value );
+
+				// *... In the case of properties that might _actually_
+				// have dashes, we need to also store a copy of that
+				// unchanged property.
+				if ( key.indexOf("-") !== -1 && data !== undefined ) {
+					data_user.set( this, key, value );
+				}
+			});
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			data_user.remove( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? JSON.parse( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			data_user.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = data_priv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray( data ) ) {
+					queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				data_priv.remove( elem, [ type + "queue", key ] );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook,
+	rclass = /[\t\r\n\f]/g,
+	rreturn = /\r/g,
+	rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each(function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		});
+	},
+
+	addClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call( this, j, this.className ) );
+			});
+		}
+
+		if ( proceed ) {
+			// The disjunction here is for better compressibility (see removeClass)
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					" "
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+					elem.className = jQuery.trim( cur );
+
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = arguments.length === 0 || typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, this.className ) );
+			});
+		}
+		if ( proceed ) {
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					""
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( cur ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					classNames = value.match( core_rnotwhite ) || [];
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( type === core_strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					data_priv.set( this, "__className__", this.className );
+				}
+
+				// If the element has a class name or if we're passed "false",
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// IE6-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+							// Don't return options that are disabled or in a disabled optgroup
+							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+					if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+						optionSet = true;
+					}
+				}
+
+				// force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attr: function( elem, name, value ) {
+		var hooks, ret,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === core_strundefined ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+
+			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+			ret = jQuery.find.attr( elem, name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret == null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( core_rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( (name = attrNames[i++]) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( jQuery.expr.match.bool.test( name ) ) {
+					// Set corresponding property to false
+					elem[ propName ] = false;
+				}
+
+				elem.removeAttribute( name );
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+				ret :
+				( elem[ name ] = value );
+
+		} else {
+			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+				ret :
+				elem[ name ];
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+					elem.tabIndex :
+					-1;
+			}
+		}
+	}
+});
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+	jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) {
+		var fn = jQuery.expr.attrHandle[ name ],
+			ret = isXML ?
+				undefined :
+				/* jshint eqeqeq: false */
+				// Temporarily disable this handler to check existence
+				(jQuery.expr.attrHandle[ name ] = undefined) !=
+					getter( elem, name, isXML ) ?
+
+					name.toLowerCase() :
+					null;
+
+		// Restore handler
+		jQuery.expr.attrHandle[ name ] = fn;
+
+		return ret;
+	};
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		}
+	};
+}
+
+jQuery.each([
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	};
+	if ( !jQuery.support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			// Support: Webkit
+			// "" is returned instead of "on" if a value isn't specified
+			return elem.getAttribute("value") === null ? "on" : elem.value;
+		};
+	}
+});
+var rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = data_priv.get( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !(events = elemData.events) ) {
+			events = elemData.events = {};
+		}
+		if ( !(eventHandle = elemData.handle) ) {
+			eventHandle = elemData.handle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !(handlers = events[ type ]) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+			data_priv.remove( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special,
+			eventPath = [ elem || document ],
+			type = core_hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf(":") < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === (elem.ownerDocument || document) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+				jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, j, ret, matched, handleObj,
+			handlerQueue = [],
+			args = core_slice.call( arguments ),
+			handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( (event.result = ret) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, matches, sel, handleObj,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.disabled !== true || event.type !== "click" ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, handlers: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+		}
+
+		return handlerQueue;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: Cordova 2.5 (WebKit) (#13255)
+		// All events should have a target; Cordova deviceready doesn't
+		if ( !event.target ) {
+			event.target = document;
+		}
+
+		// Support: Safari 6.0+, Chrome < 28
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		focus: {
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== safeActiveElement() && this.focus ) {
+					this.focus();
+					return false;
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === safeActiveElement() && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+		click: {
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return jQuery.nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle, false );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && e.preventDefault ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && e.stopPropagation ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) {
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[0];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+});
+var isSimple = /^.[^:#\[\.,]*$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var i,
+			ret = [],
+			self = this,
+			len = self.length;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter(function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			}) );
+		}
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = this.selector ? this.selector + " " + selector : selector;
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter(function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], true) );
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], false) );
+	},
+
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+				// Always skip document fragments
+				if ( cur.nodeType < 11 && (pos ?
+					pos.index(cur) > -1 :
+
+					// Don't pass non-elements to Sizzle
+					cur.nodeType === 1 &&
+						jQuery.find.matchesSelector(cur, selectors)) ) {
+
+					cur = matched.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return core_indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return core_indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( jQuery.unique(all) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+function sibling( cur, dir ) {
+	while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+
+	return cur;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.unique( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		var elem = elems[ 0 ];
+
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 && elem.nodeType === 1 ?
+			jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+			jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+				return elem.nodeType === 1;
+			}));
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			truncate = until !== undefined;
+
+		while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+			if ( elem.nodeType === 1 ) {
+				if ( truncate && jQuery( elem ).is( until ) ) {
+					break;
+				}
+				matched.push( elem );
+			}
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var matched = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				matched.push( n );
+			}
+		}
+
+		return matched;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			/* jshint -W018 */
+			return !!qualifier.call( elem, i, elem ) !== not;
+		});
+
+	}
+
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		});
+
+	}
+
+	if ( typeof qualifier === "string" ) {
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not;
+	});
+}
+var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /^$|\/(?:java|ecma)script/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+	// We have to close these tags to support XHTML (#13200)
+	wrapMap = {
+
+		// Support: IE 9
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+		thead: [ 1, "<table>", "</table>" ],
+		col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+		_default: [ 0, "", "" ]
+	};
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		});
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			elems = selector ? jQuery.filter( selector, this ) : this,
+			i = 0;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+			if ( !keepData && elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem ) );
+			}
+
+			if ( elem.parentNode ) {
+				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+					setGlobalEval( getAll( elem, "script" ) );
+				}
+				elem.parentNode.removeChild( elem );
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var
+			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+			args = jQuery.map( this, function( elem ) {
+				return [ elem.nextSibling, elem.parentNode ];
+			}),
+			i = 0;
+
+		// Make the changes, replacing each context element with the new content
+		this.domManip( arguments, function( elem ) {
+			var next = args[ i++ ],
+				parent = args[ i++ ];
+
+			if ( parent ) {
+				// Don't use the snapshot next if it has moved (#13810)
+				if ( next && next.parentNode !== parent ) {
+					next = this.nextSibling;
+				}
+				jQuery( this ).remove();
+				parent.insertBefore( elem, next );
+			}
+		// Allow new content to include elements from the context set
+		}, true );
+
+		// Force removal if there was no new content (e.g., from empty arguments)
+		return i ? this : this.remove();
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, callback, allowIntersection ) {
+
+		// Flatten any nested arrays
+		args = core_concat.apply( [], args );
+
+		var fragment, first, scripts, hasScripts, node, doc,
+			i = 0,
+			l = this.length,
+			set = this,
+			iNoClone = l - 1,
+			value = args[ 0 ],
+			isFunction = jQuery.isFunction( value );
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+			return this.each(function( index ) {
+				var self = set.eq( index );
+				if ( isFunction ) {
+					args[ 0 ] = value.call( this, index, self.html() );
+				}
+				self.domManip( args, callback, allowIntersection );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+				hasScripts = scripts.length;
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				for ( ; i < l; i++ ) {
+					node = fragment;
+
+					if ( i !== iNoClone ) {
+						node = jQuery.clone( node, true, true );
+
+						// Keep references to cloned scripts for later restoration
+						if ( hasScripts ) {
+							// Support: QtWebKit
+							// jQuery.merge because core_push.apply(_, arraylike) throws
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call( this[ i ], node, i );
+				}
+
+				if ( hasScripts ) {
+					doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+					// Reenable scripts
+					jQuery.map( scripts, restoreScript );
+
+					// Evaluate executable scripts on first document insertion
+					for ( i = 0; i < hasScripts; i++ ) {
+						node = scripts[ i ];
+						if ( rscriptType.test( node.type || "" ) &&
+							!data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+							if ( node.src ) {
+								// Hope ajax is available...
+								jQuery._evalUrl( node.src );
+							} else {
+								jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return this;
+	}
+});
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: QtWebKit
+			// .get() because core_push.apply(_, arraylike) throws
+			core_push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		// Support: IE >= 9
+		// Fix Cloning issues
+		if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		var elem, tmp, tag, wrap, contains, j,
+			i = 0,
+			l = elems.length,
+			fragment = context.createDocumentFragment(),
+			nodes = [];
+
+		for ( ; i < l; i++ ) {
+			elem = elems[ i ];
+
+			if ( elem || elem === 0 ) {
+
+				// Add nodes directly
+				if ( jQuery.type( elem ) === "object" ) {
+					// Support: QtWebKit
+					// jQuery.merge because core_push.apply(_, arraylike) throws
+					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+				// Convert non-html into a text node
+				} else if ( !rhtml.test( elem ) ) {
+					nodes.push( context.createTextNode( elem ) );
+
+				// Convert html into DOM nodes
+				} else {
+					tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+					// Deserialize a standard representation
+					tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+					tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+					// Descend through wrappers to the right content
+					j = wrap[ 0 ];
+					while ( j-- ) {
+						tmp = tmp.lastChild;
+					}
+
+					// Support: QtWebKit
+					// jQuery.merge because core_push.apply(_, arraylike) throws
+					jQuery.merge( nodes, tmp.childNodes );
+
+					// Remember the top-level container
+					tmp = fragment.firstChild;
+
+					// Fixes #12346
+					// Support: Webkit, IE
+					tmp.textContent = "";
+				}
+			}
+		}
+
+		// Remove wrapper from fragment
+		fragment.textContent = "";
+
+		i = 0;
+		while ( (elem = nodes[ i++ ]) ) {
+
+			// #4087 - If origin and destination elements are the same, and this is
+			// that element, do not do anything
+			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+				continue;
+			}
+
+			contains = jQuery.contains( elem.ownerDocument, elem );
+
+			// Append to fragment
+			tmp = getAll( fragment.appendChild( elem ), "script" );
+
+			// Preserve script evaluation history
+			if ( contains ) {
+				setGlobalEval( tmp );
+			}
+
+			// Capture executables
+			if ( scripts ) {
+				j = 0;
+				while ( (elem = tmp[ j++ ]) ) {
+					if ( rscriptType.test( elem.type || "" ) ) {
+						scripts.push( elem );
+					}
+				}
+			}
+		}
+
+		return fragment;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, events, type, key, j,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+			if ( Data.accepts( elem ) ) {
+				key = elem[ data_priv.expando ];
+
+				if ( key && (data = data_priv.cache[ key ]) ) {
+					events = Object.keys( data.events || {} );
+					if ( events.length ) {
+						for ( j = 0; (type = events[j]) !== undefined; j++ ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+					if ( data_priv.cache[ key ] ) {
+						// Discard any remaining `private` data
+						delete data_priv.cache[ key ];
+					}
+				}
+			}
+			// Discard any remaining `user` data
+			delete data_user.cache[ elem[ data_user.expando ] ];
+		}
+	},
+
+	_evalUrl: function( url ) {
+		return jQuery.ajax({
+			url: url,
+			type: "GET",
+			dataType: "script",
+			async: false,
+			global: false,
+			"throws": true
+		});
+	}
+});
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+		elem.getElementsByTagName("tbody")[0] ||
+			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+		elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+
+	if ( match ) {
+		elem.type = match[ 1 ];
+	} else {
+		elem.removeAttribute("type");
+	}
+
+	return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var l = elems.length,
+		i = 0;
+
+	for ( ; i < l; i++ ) {
+		data_priv.set(
+			elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( data_priv.hasData( src ) ) {
+		pdataOld = data_priv.access( src );
+		pdataCur = data_priv.set( dest, pdataOld );
+		events = pdataOld.events;
+
+		if ( events ) {
+			delete pdataCur.handle;
+			pdataCur.events = {};
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( data_user.hasData( src ) ) {
+		udataOld = data_user.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		data_user.set( dest, udataCur );
+	}
+}
+
+
+function getAll( context, tag ) {
+	var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+			context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+			[];
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], ret ) :
+		ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+jQuery.fn.extend({
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[ 0 ] ) {
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function( i ) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	}
+});
+var curCSS, iframe,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	// isHidden might be called from jQuery#filter function;
+	// in that case, element will be second argument
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+function getStyles( elem ) {
+	return window.getComputedStyle( elem, null );
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = data_priv.get( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+
+			if ( !values[ index ] ) {
+				hidden = isHidden( elem );
+
+				if ( display && display !== "none" || !hidden ) {
+					data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );
+				}
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( jQuery.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each(function() {
+			if ( isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"columnCount": true,
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": "cssFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+			// but it would mean to define eight (for every problematic property) identical functions
+			if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+				style[ name ] = value;
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+});
+
+curCSS = function( elem, name, _computed ) {
+	var width, minWidth, maxWidth,
+		computed = _computed || getStyles( elem ),
+
+		// Support: IE9
+		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+		style = elem.style;
+
+	if ( computed ) {
+
+		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// Support: Safari 5.1
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+		// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+		if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret;
+};
+
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+			// Use the already-created iframe if possible
+			iframe = ( iframe ||
+				jQuery("<iframe frameborder='0' width='0' height='0'/>")
+				.css( "cssText", "display:block !important" )
+			).appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+			doc.write("<!doctype html><html><body>");
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+		display = jQuery.css( elem[0], "display" );
+	elem.remove();
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+					jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					}) :
+					getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+});
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	// Support: Android 2.3
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// Support: Android 2.3
+					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+					// Work around by temporarily setting element display to inline-block
+					return jQuery.swap( elem, { "display": "inline-block" },
+						curCSS, [ elem, "marginRight" ] );
+				}
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						computed = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( computed ) ?
+							jQuery( elem ).position()[ prop ] + "px" :
+							computed;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		// Support: Opera <= 12.12
+		// Opera reports offsetWidths and offsetHeights less than zero on some elements
+		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+jQuery.fn.extend({
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		})
+		.filter(function(){
+			var type = this.type;
+			// Use .is(":disabled") so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !manipulation_rcheckableType.test( type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		});
+
+	} else {
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+});
+
+jQuery.fn.extend({
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	}
+});
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	ajax_nonce = jQuery.now(),
+
+	ajax_rquery = /\?/,
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			while ( (dataType = dataTypes[i++]) ) {
+				// Prepend if requested
+				if ( dataType[0] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+				// Otherwise append
+				} else {
+					(structure[ dataType ] = structure[ dataType ] || []).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		});
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax({
+			url: url,
+
+			// if "type" variable is undefined, then "GET" method will be used
+			type: type,
+			dataType: "html",
+			data: params
+		}).done(function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		}).complete( callback && function( jqXHR, status ) {
+			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+		});
+	}
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+	jQuery.fn[ type ] = function( fn ){
+		return this.on( type, fn );
+	};
+});
+
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText",
+			json: "responseJSON"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var transport,
+			// URL without anti-cache param
+			cacheURL,
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+				jQuery( callbackContext ) :
+				jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks("once memory"),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( (match = rheaders.exec( responseHeadersString )) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match == null ? null : match;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (prefilters might expect it)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger("ajaxStart");
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+			}
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout(function() {
+					jqXHR.abort("timeout");
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("etag");
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger("ajaxStop");
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		});
+	};
+});
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+		// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s[ "throws" ] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /(?:java|ecma)script/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+		var script, callback;
+		return {
+			send: function( _, complete ) {
+				script = jQuery("<script>").prop({
+					async: true,
+					charset: s.scriptCharset,
+					src: s.url
+				}).on(
+					"load error",
+					callback = function( evt ) {
+						script.remove();
+						callback = null;
+						if ( evt ) {
+							complete( evt.type === "error" ? 404 : 200, evt.type );
+						}
+					}
+				);
+				document.head.appendChild( script[ 0 ] );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+});
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+jQuery.ajaxSettings.xhr = function() {
+	try {
+		return new XMLHttpRequest();
+	} catch( e ) {}
+};
+
+var xhrSupported = jQuery.ajaxSettings.xhr(),
+	xhrSuccessStatus = {
+		// file protocol always yields status code 0, assume 200
+		0: 200,
+		// Support: IE9
+		// #1450: sometimes IE returns 1223 when it should be 204
+		1223: 204
+	},
+	// Support: IE9
+	// We need to keep track of outbound xhr and abort them manually
+	// because IE is not smart enough to do it all by itself
+	xhrId = 0,
+	xhrCallbacks = {};
+
+if ( window.ActiveXObject ) {
+	jQuery( window ).on( "unload", function() {
+		for( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]();
+		}
+		xhrCallbacks = undefined;
+	});
+}
+
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+jQuery.support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+	var callback;
+	// Cross domain only allowed if supported through XMLHttpRequest
+	if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
+		return {
+			send: function( headers, complete ) {
+				var i, id,
+					xhr = options.xhr();
+				xhr.open( options.type, options.url, options.async, options.username, options.password );
+				// Apply custom fields if provided
+				if ( options.xhrFields ) {
+					for ( i in options.xhrFields ) {
+						xhr[ i ] = options.xhrFields[ i ];
+					}
+				}
+				// Override mime type if needed
+				if ( options.mimeType && xhr.overrideMimeType ) {
+					xhr.overrideMimeType( options.mimeType );
+				}
+				// X-Requested-With header
+				// For cross-domain requests, seeing as conditions for a preflight are
+				// akin to a jigsaw puzzle, we simply never set it to be sure.
+				// (it can always be set on a per-request basis or even using ajaxSetup)
+				// For same-domain requests, won't change header if already provided.
+				if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+					headers["X-Requested-With"] = "XMLHttpRequest";
+				}
+				// Set headers
+				for ( i in headers ) {
+					xhr.setRequestHeader( i, headers[ i ] );
+				}
+				// Callback
+				callback = function( type ) {
+					return function() {
+						if ( callback ) {
+							delete xhrCallbacks[ id ];
+							callback = xhr.onload = xhr.onerror = null;
+							if ( type === "abort" ) {
+								xhr.abort();
+							} else if ( type === "error" ) {
+								complete(
+									// file protocol always yields status 0, assume 404
+									xhr.status || 404,
+									xhr.statusText
+								);
+							} else {
+								complete(
+									xhrSuccessStatus[ xhr.status ] || xhr.status,
+									xhr.statusText,
+									// Support: IE9
+									// #11426: When requesting binary data, IE9 will throw an exception
+									// on any attempt to access responseText
+									typeof xhr.responseText === "string" ? {
+										text: xhr.responseText
+									} : undefined,
+									xhr.getAllResponseHeaders()
+								);
+							}
+						}
+					};
+				};
+				// Listen to events
+				xhr.onload = callback();
+				xhr.onerror = callback("error");
+				// Create the abort callback
+				callback = xhrCallbacks[( id = xhrId++ )] = callback("abort");
+				// Do send the request
+				// This may raise an exception which is actually
+				// handled in jQuery.ajax (so no try/catch here)
+				xhr.send( options.hasContent && options.data || null );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+});
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var tween = this.createTween( prop, value ),
+				target = tween.cur(),
+				parts = rfxnum.exec( value ),
+				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+				// Starting value computation is required for potential unit mismatches
+				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+				scale = 1,
+				maxIterations = 20;
+
+			if ( start && start[ 3 ] !== unit ) {
+				// Trust units reported by jQuery.css
+				unit = unit || start[ 3 ];
+
+				// Make sure we update the tween properties later on
+				parts = parts || [];
+
+				// Iteratively approximate from a nonzero starting point
+				start = +target || 1;
+
+				do {
+					// If previous iteration zeroed out, double until we get *something*
+					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+					scale = scale || ".5";
+
+					// Adjust and apply
+					start = start / scale;
+					jQuery.style( tween.elem, prop, start + unit );
+
+				// Update scale, tolerating zero or NaN from tween.cur()
+				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+			}
+
+			// Update tween properties
+			if ( parts ) {
+				start = tween.start = +start || +target || 0;
+				tween.unit = unit;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[ 1 ] ?
+					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+					+parts[ 2 ];
+			}
+
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+			// we're done with this property
+			return tween;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHidden( elem ),
+		dataShow = data_priv.get( elem, "fxshow" );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE9-10 do not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			style.display = "inline-block";
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		anim.always(function() {
+			style.overflow = opts.overflow[ 0 ];
+			style.overflowX = opts.overflow[ 1 ];
+			style.overflowY = opts.overflow[ 2 ];
+		});
+	}
+
+
+	// show/hide pass
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	if ( !jQuery.isEmptyObject( orig ) ) {
+		if ( dataShow ) {
+			if ( "hidden" in dataShow ) {
+				hidden = dataShow.hidden;
+			}
+		} else {
+			dataShow = data_priv.access( elem, "fxshow", {} );
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+
+			data_priv.remove( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( prop in orig ) {
+			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || data_priv.get( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = data_priv.get( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each(function() {
+			var index,
+				data = data_priv.get( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// enable finishing flag on private data
+			data.finish = true;
+
+			// empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// turn off finishing flag
+			delete data.finish;
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) ) {
+		jQuery.fx.start();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, win,
+		elem = this[ 0 ],
+		box = { top: 0, left: 0 },
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	return {
+		top: box.top + win.pageYOffset - docElem.clientTop,
+		left: box.left + win.pageXOffset - docElem.clientLeft
+	};
+};
+
+jQuery.offset = {
+
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) && ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+		// Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+			// We assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+
+		} else {
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || docElem;
+
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || docElem;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : window.pageXOffset,
+					top ? val : window.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+	// Expose jQuery as module.exports in loaders that implement the Node
+	// module pattern (including browserify). Do not create the global, since
+	// the user will be storing it themselves locally, and globals are frowned
+	// upon in the Node module world.
+	module.exports = jQuery;
+} else {
+	// Register as a named AMD module, since jQuery can be concatenated with other
+	// files that may use define, but not via a proper concatenation script that
+	// understands anonymous AMD modules. A named AMD is safest and most robust
+	// way to register. Lowercase jquery is used because AMD module names are
+	// derived from file names, and jQuery is normally delivered in a lowercase
+	// file name. Do this after creating the global so that if an AMD module wants
+	// to call noConflict to hide this version of jQuery, it will work.
+	if ( typeof define === "function" && define.amd ) {
+		define( "jquery", [], function () { return jQuery; } );
+	}
+}
+
+// If there is a window object, that at least has a document property,
+// define jQuery and $ identifiers
+if ( typeof window === "object" && typeof window.document === "object" ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+})( window );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/js/processing-1.4.1.min.js	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,13 @@
+/***
+
+    P R O C E S S I N G . J S - 1.4.1
+    a port of the Processing visualization language
+
+    Processing.js is licensed under the MIT License, see LICENSE.
+    For a list of copyright holders, please refer to AUTHORS.
+
+    http://processingjs.org
+
+***/
+
+(function(D,d,q,t){var G=function(){};var s=function(){if("console" in D){return function(N){D.console.log("Processing.js: "+N)}}return G}();var w=function(N){var O=new XMLHttpRequest;O.open("GET",N,false);if(O.overrideMimeType){O.overrideMimeType("text/plain")}O.setRequestHeader("If-Modified-Since","Fri, 01 Jan 1960 00:00:00 GMT");O.send(null);if(O.status!==200&&O.status!==0){throw"XMLHttpRequest failed, status code "+O.status}return O.responseText};var n="document" in this&&!("fake" in this.document);d.head=d.head||d.getElementsByTagName("head")[0];function C(N,O){if(N in D){return D[N]}if(typeof D[O]==="function"){return D[O]}return function(Q){if(Q instanceof Array){return Q}if(typeof Q==="number"){var P=[];P.length=Q;return P}}}if(d.documentMode>=9&&!d.doctype){throw"The doctype directive is missing. The recommended doctype in Internet Explorer is the HTML5 doctype: <!DOCTYPE html>"}var e=C("Float32Array","WebGLFloatArray"),K=C("Int32Array","WebGLIntArray"),y=C("Uint16Array","WebGLUnsignedShortArray"),b=C("Uint8Array","WebGLUnsignedByteArray");var B={X:0,Y:1,Z:2,R:3,G:4,B:5,A:6,U:7,V:8,NX:9,NY:10,NZ:11,EDGE:12,SR:13,SG:14,SB:15,SA:16,SW:17,TX:18,TY:19,TZ:20,VX:21,VY:22,VZ:23,VW:24,AR:25,AG:26,AB:27,DR:3,DG:4,DB:5,DA:6,SPR:28,SPG:29,SPB:30,SHINE:31,ER:32,EG:33,EB:34,BEEN_LIT:35,VERTEX_FIELD_COUNT:36,P2D:1,JAVA2D:1,WEBGL:2,P3D:2,OPENGL:2,PDF:0,DXF:0,OTHER:0,WINDOWS:1,MAXOSX:2,LINUX:3,EPSILON:0.0001,MAX_FLOAT:3.4028235e+38,MIN_FLOAT:-3.4028235e+38,MAX_INT:2147483647,MIN_INT:-2147483648,PI:q.PI,TWO_PI:2*q.PI,HALF_PI:q.PI/2,THIRD_PI:q.PI/3,QUARTER_PI:q.PI/4,DEG_TO_RAD:q.PI/180,RAD_TO_DEG:180/q.PI,WHITESPACE:" \t\n\r\u000c\u00a0",RGB:1,ARGB:2,HSB:3,ALPHA:4,CMYK:5,TIFF:0,TARGA:1,JPEG:2,GIF:3,BLUR:11,GRAY:12,INVERT:13,OPAQUE:14,POSTERIZE:15,THRESHOLD:16,ERODE:17,DILATE:18,REPLACE:0,BLEND:1<<0,ADD:1<<1,SUBTRACT:1<<2,LIGHTEST:1<<3,DARKEST:1<<4,DIFFERENCE:1<<5,EXCLUSION:1<<6,MULTIPLY:1<<7,SCREEN:1<<8,OVERLAY:1<<9,HARD_LIGHT:1<<10,SOFT_LIGHT:1<<11,DODGE:1<<12,BURN:1<<13,ALPHA_MASK:4278190080,RED_MASK:16711680,GREEN_MASK:65280,BLUE_MASK:255,CUSTOM:0,ORTHOGRAPHIC:2,PERSPECTIVE:3,POINT:2,POINTS:2,LINE:4,LINES:4,TRIANGLE:8,TRIANGLES:9,TRIANGLE_STRIP:10,TRIANGLE_FAN:11,QUAD:16,QUADS:16,QUAD_STRIP:17,POLYGON:20,PATH:21,RECT:30,ELLIPSE:31,ARC:32,SPHERE:40,BOX:41,GROUP:0,PRIMITIVE:1,GEOMETRY:3,VERTEX:0,BEZIER_VERTEX:1,CURVE_VERTEX:2,BREAK:3,CLOSESHAPE:4,OPEN:1,CLOSE:2,CORNER:0,CORNERS:1,RADIUS:2,CENTER_RADIUS:2,CENTER:3,DIAMETER:3,CENTER_DIAMETER:3,BASELINE:0,TOP:101,BOTTOM:102,NORMAL:1,NORMALIZED:1,IMAGE:2,MODEL:4,SHAPE:5,SQUARE:"butt",ROUND:"round",PROJECT:"square",MITER:"miter",BEVEL:"bevel",AMBIENT:0,DIRECTIONAL:1,SPOT:3,BACKSPACE:8,TAB:9,ENTER:10,RETURN:13,ESC:27,DELETE:127,CODED:65535,SHIFT:16,CONTROL:17,ALT:18,CAPSLK:20,PGUP:33,PGDN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLK:144,META:157,INSERT:155,ARROW:"default",CROSS:"crosshair",HAND:"pointer",MOVE:"move",TEXT:"text",WAIT:"wait",NOCURSOR:"url('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='), auto",DISABLE_OPENGL_2X_SMOOTH:1,ENABLE_OPENGL_2X_SMOOTH:-1,ENABLE_OPENGL_4X_SMOOTH:2,ENABLE_NATIVE_FONTS:3,DISABLE_DEPTH_TEST:4,ENABLE_DEPTH_TEST:-4,ENABLE_DEPTH_SORT:5,DISABLE_DEPTH_SORT:-5,DISABLE_OPENGL_ERROR_REPORT:6,ENABLE_OPENGL_ERROR_REPORT:-6,ENABLE_ACCURATE_TEXTURES:7,DISABLE_ACCURATE_TEXTURES:-7,HINT_COUNT:10,SINCOS_LENGTH:720,PRECISIONB:15,PRECISIONF:1<<15,PREC_MAXVAL:(1<<15)-1,PREC_ALPHA_SHIFT:24-15,PREC_RED_SHIFT:16-15,NORMAL_MODE_AUTO:0,NORMAL_MODE_SHAPE:1,NORMAL_MODE_VERTEX:2,MAX_LIGHTS:8};function h(P){if(typeof P==="string"){var O=0;for(var N=0;N<P.length;++N){O=O*31+P.charCodeAt(N)&4294967295}return O}if(typeof P!=="object"){return P&4294967295}if(P.hashCode instanceof Function){return P.hashCode()}if(P.$id===t){P.$id=q.floor(q.random()*65536)-32768<<16|q.floor(q.random()*65536)}return P.$id}function r(O,N){if(O===null||N===null){return O===null&&N===null}if(typeof O==="string"){return O===N}if(typeof O!=="object"){return O===N}if(O.equals instanceof Function){return O.equals(N)}return O===N}var o=function(O){if(O.iterator instanceof Function){return O.iterator()}if(O instanceof Array){var N=-1;this.hasNext=function(){return ++N<O.length};this.next=function(){return O[N]}}else{throw"Unable to iterate: "+O}};var f=function(){function O(Q){var P=0;this.hasNext=function(){return P<Q.length};this.next=function(){return Q[P++]};this.remove=function(){Q.splice(P,1)}}function N(P){var Q;if(P instanceof N){Q=P.toArray()}else{Q=[];if(typeof P==="number"){Q.length=P>0?P:0}}this.get=function(R){return Q[R]};this.contains=function(R){return this.indexOf(R)>-1};this.indexOf=function(T){for(var S=0,R=Q.length;S<R;++S){if(r(T,Q[S])){return S}}return -1};this.lastIndexOf=function(S){for(var R=Q.length-1;R>=0;--R){if(r(S,Q[R])){return R}}return -1};this.add=function(){if(arguments.length===1){Q.push(arguments[0])}else{if(arguments.length===2){var R=arguments[0];if(typeof R==="number"){if(R>=0&&R<=Q.length){Q.splice(R,0,arguments[1])}else{throw R+" is not a valid index"}}else{throw typeof R+" is not a number"}}else{throw"Please use the proper number of parameters."}}};this.addAll=function(S,R){var T;if(typeof S==="number"){if(S<0||S>Q.length){throw"Index out of bounds for addAll: "+S+" greater or equal than "+Q.length}T=new o(R);while(T.hasNext()){Q.splice(S++,0,T.next())}}else{T=new o(S);while(T.hasNext()){Q.push(T.next())}}};this.set=function(){if(arguments.length===2){var R=arguments[0];if(typeof R==="number"){if(R>=0&&R<Q.length){Q.splice(R,1,arguments[1])}else{throw R+" is not a valid index."}}else{throw typeof R+" is not a number"}}else{throw"Please use the proper number of parameters."}};this.size=function(){return Q.length};this.clear=function(){Q.length=0};this.remove=function(R){if(typeof R==="number"){return Q.splice(R,1)[0]}R=this.indexOf(R);if(R>-1){Q.splice(R,1);return true}return false};this.removeAll=function(V){var S,R,U,T=new N;T.addAll(this);this.clear();for(S=0,R=0;S<T.size();S++){U=T.get(S);if(!V.contains(U)){this.add(R++,U)}}if(this.size()<T.size()){return true}return false};this.isEmpty=function(){return !Q.length};this.clone=function(){return new N(this)};this.toArray=function(){return Q.slice(0)};this.iterator=function(){return new O(Q)}}return N}();var x=function(){function N(){if(arguments.length===1&&arguments[0] instanceof N){return arguments[0].clone()}var W=arguments.length>0?arguments[0]:16;var X=arguments.length>1?arguments[1]:0.75;var Q=[];Q.length=W;var S=0;var O=this;function U(Z){var Y=h(Z)%Q.length;return Y<0?Q.length+Y:Y}function R(){if(S<=X*Q.length){return}var ab=[];for(var aa=0;aa<Q.length;++aa){if(Q[aa]!==t){ab=ab.concat(Q[aa])}}var ac=Q.length*2;Q=[];Q.length=ac;for(var Z=0;Z<ab.length;++Z){var Y=U(ab[Z].key);var ad=Q[Y];if(ad===t){Q[Y]=ad=[]}ad.push(ab[Z])}}function P(ad,ae){var Y=0;var ac=-1;var ab=false;var aa;function Z(){while(!ab){++ac;if(Y>=Q.length){ab=true}else{if(Q[Y]===t||ac>=Q[Y].length){ac=-1;++Y}else{return}}}}this.hasNext=function(){return !ab};this.next=function(){aa=ad(Q[Y][ac]);Z();return aa};this.remove=function(){if(aa!==t){ae(aa);--ac;Z()}};Z()}function V(Y,Z,aa){this.clear=function(){O.clear()};this.contains=function(ab){return Z(ab)};this.containsAll=function(ac){var ab=ac.iterator();while(ab.hasNext()){if(!this.contains(ab.next())){return false}}return true};this.isEmpty=function(){return O.isEmpty()};this.iterator=function(){return new P(Y,aa)};this.remove=function(ab){if(this.contains(ab)){aa(ab);return true}return false};this.removeAll=function(ae){var ab=ae.iterator();var ad=false;while(ab.hasNext()){var ac=ab.next();if(this.contains(ac)){aa(ac);ad=true}}return true};this.retainAll=function(af){var ad=this.iterator();var ac=[];while(ad.hasNext()){var ae=ad.next();if(!af.contains(ae)){ac.push(ae)}}for(var ab=0;ab<ac.length;++ab){aa(ac[ab])}return ac.length>0};this.size=function(){return O.size()};this.toArray=function(){var ab=[];var ac=this.iterator();while(ac.hasNext()){ab.push(ac.next())}return ab}}function T(Y){this._isIn=function(Z){return Z===O&&Y.removed===t};this.equals=function(Z){return r(Y.key,Z.getKey())};this.getKey=function(){return Y.key};this.getValue=function(){return Y.value};this.hashCode=function(Z){return h(Y.key)};this.setValue=function(aa){var Z=Y.value;Y.value=aa;return Z}}this.clear=function(){S=0;Q=[];Q.length=W};this.clone=function(){var Y=new N;Y.putAll(this);return Y};this.containsKey=function(aa){var Y=U(aa);var ab=Q[Y];if(ab===t){return false}for(var Z=0;Z<ab.length;++Z){if(r(ab[Z].key,aa)){return true}}return false};this.containsValue=function(aa){for(var Z=0;Z<Q.length;++Z){var ab=Q[Z];if(ab===t){continue}for(var Y=0;Y<ab.length;++Y){if(r(ab[Y].value,aa)){return true}}}return false};this.entrySet=function(){return new V(function(Y){return new T(Y)},function(Y){return Y instanceof T&&Y._isIn(O)},function(Y){return O.remove(Y.getKey())})};this.get=function(aa){var Y=U(aa);var ab=Q[Y];if(ab===t){return null}for(var Z=0;Z<ab.length;++Z){if(r(ab[Z].key,aa)){return ab[Z].value}}return null};this.isEmpty=function(){return S===0};this.keySet=function(){return new V(function(Y){return Y.key},function(Y){return O.containsKey(Y)},function(Y){return O.remove(Y)})};this.values=function(){return new V(function(Y){return Y.value},function(Y){return O.containsValue(Y)},function(Y){return O.removeByValue(Y)})};this.put=function(aa,ac){var Y=U(aa);var ad=Q[Y];if(ad===t){++S;Q[Y]=[{key:aa,value:ac}];R();return null}for(var Z=0;Z<ad.length;++Z){if(r(ad[Z].key,aa)){var ab=ad[Z].value;ad[Z].value=ac;return ab}}++S;ad.push({key:aa,value:ac});R();return null};this.putAll=function(Y){var Z=Y.entrySet().iterator();while(Z.hasNext()){var aa=Z.next();this.put(aa.getKey(),aa.getValue())}};this.remove=function(aa){var Y=U(aa);var ac=Q[Y];if(ac===t){return null}for(var Z=0;Z<ac.length;++Z){if(r(ac[Z].key,aa)){--S;var ab=ac[Z].value;ac[Z].removed=true;if(ac.length>1){ac.splice(Z,1)}else{Q[Y]=t}return ab}}return null};this.removeByValue=function(aa){var ac,Z,Y,ab;for(ac in Q){if(Q.hasOwnProperty(ac)){for(Z=0,Y=Q[ac].length;Z<Y;Z++){ab=Q[ac][Z];if(ab.value===aa){Q[ac].splice(Z,1);return true}}}}return false};this.size=function(){return S}}return N}();var A=function(){function N(Q,S,R){this.x=Q||0;this.y=S||0;this.z=R||0}N.dist=function(R,Q){return R.dist(Q)};N.dot=function(R,Q){return R.dot(Q)};N.cross=function(R,Q){return R.cross(Q)};N.angleBetween=function(R,Q){return q.acos(R.dot(Q)/(R.mag()*Q.mag()))};N.prototype={set:function(Q,S,R){if(arguments.length===1){this.set(Q.x||Q[0]||0,Q.y||Q[1]||0,Q.z||Q[2]||0)}else{this.x=Q;this.y=S;this.z=R}},get:function(){return new N(this.x,this.y,this.z)},mag:function(){var Q=this.x,S=this.y,R=this.z;return q.sqrt(Q*Q+S*S+R*R)},add:function(Q,S,R){if(arguments.length===1){this.x+=Q.x;this.y+=Q.y;this.z+=Q.z}else{this.x+=Q;this.y+=S;this.z+=R}},sub:function(Q,S,R){if(arguments.length===1){this.x-=Q.x;this.y-=Q.y;this.z-=Q.z}else{this.x-=Q;this.y-=S;this.z-=R}},mult:function(Q){if(typeof Q==="number"){this.x*=Q;this.y*=Q;this.z*=Q}else{this.x*=Q.x;this.y*=Q.y;this.z*=Q.z}},div:function(Q){if(typeof Q==="number"){this.x/=Q;this.y/=Q;this.z/=Q}else{this.x/=Q.x;this.y/=Q.y;this.z/=Q.z}},dist:function(T){var S=this.x-T.x,R=this.y-T.y,Q=this.z-T.z;return q.sqrt(S*S+R*R+Q*Q)},dot:function(Q,S,R){if(arguments.length===1){return this.x*Q.x+this.y*Q.y+this.z*Q.z}return this.x*Q+this.y*S+this.z*R},cross:function(R){var Q=this.x,T=this.y,S=this.z;return new N(T*R.z-R.y*S,S*R.x-R.z*Q,Q*R.y-R.x*T)},normalize:function(){var Q=this.mag();if(Q>0){this.div(Q)}},limit:function(Q){if(this.mag()>Q){this.normalize();this.mult(Q)}},heading2D:function(){return -q.atan2(-this.y,this.x)},toString:function(){return"["+this.x+", "+this.y+", "+this.z+"]"},array:function(){return[this.x,this.y,this.z]}};function O(Q){return function(T,S){var R=T.get();R[Q](S);return R}}for(var P in N.prototype){if(N.prototype.hasOwnProperty(P)&&!N.hasOwnProperty(P)){N[P]=O(P)}}return N}();function M(){}M.prototype=B;var g=new M;g.ArrayList=f;g.HashMap=x;g.PVector=A;g.ObjectIterator=o;g.PConstants=B;g.defineProperty=function(O,N,P){if("defineProperty" in Object){Object.defineProperty(O,N,P)}else{if(P.hasOwnProperty("get")){O.__defineGetter__(N,P.get)}if(P.hasOwnProperty("set")){O.__defineSetter__(N,P.set)}}};function m(O,N,R){if(!O.hasOwnProperty(N)||typeof O[N]!=="function"){O[N]=R;return}var Q=O[N];if("$overloads" in Q){Q.$defaultOverload=R;return}if(!("$overloads" in R)&&Q.length===R.length){return}var T,P;if("$overloads" in R){T=R.$overloads.slice(0);T[Q.length]=Q;P=R.$defaultOverload}else{T=[];T[R.length]=R;T[Q.length]=Q;P=Q}var S=function(){var U=S.$overloads[arguments.length]||("$methodArgsIndex" in S&&arguments.length>S.$methodArgsIndex?S.$overloads[S.$methodArgsIndex]:null)||S.$defaultOverload;return U.apply(this,arguments)};S.$overloads=T;if("$methodArgsIndex" in R){S.$methodArgsIndex=R.$methodArgsIndex}S.$defaultOverload=P;S.name=N;O[N]=S}function i(Q,P){function R(S){g.defineProperty(Q,S,{get:function(){return P[S]},set:function(T){P[S]=T},enumerable:true})}var O=[];for(var N in P){if(typeof P[N]==="function"){m(Q,N,P[N])}else{if(N.charAt(0)!=="$"&&!(N in Q)){O.push(N)}}}while(O.length>0){R(O.shift())}Q.$super=P}g.extendClassChain=function(O){var P=[O];for(var N=O.$upcast;N;N=N.$upcast){i(N,O);P.push(N);O=N}while(P.length>0){P.pop().$self=O}};g.extendStaticMembers=function(N,O){i(N,O)};g.extendInterfaceMembers=function(N,O){i(N,O)};g.addMethod=function(Q,P,S,R){var N=Q[P];if(N||R){var O=S.length;if("$overloads" in N){N.$overloads[O]=S}else{var T=function(){var V=T.$overloads[arguments.length]||("$methodArgsIndex" in T&&arguments.length>T.$methodArgsIndex?T.$overloads[T.$methodArgsIndex]:null)||T.$defaultOverload;return V.apply(this,arguments)};var U=[];if(N){U[N.length]=N}U[O]=S;T.$overloads=U;T.$defaultOverload=N||S;if(R){T.$methodArgsIndex=O}T.name=P;Q[P]=T}}else{Q[P]=S}};function l(N){if(typeof N!=="string"){return false}return["byte","int","char","color","float","long","double"].indexOf(N)!==-1}g.createJavaArray=function(S,T){var O=null,P=null;if(typeof S==="string"){if(S==="boolean"){P=false}else{if(l(S)){P=0}}}if(typeof T[0]==="number"){var N=0|T[0];if(T.length<=1){O=[];O.length=N;for(var R=0;R<N;++R){O[R]=P}}else{O=[];var U=T.slice(1);for(var Q=0;Q<N;++Q){O.push(g.createJavaArray(S,U))}}}return O};var E={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};(function(O){var R=("open() createOutput() createInput() BufferedReader selectFolder() dataPath() createWriter() selectOutput() beginRecord() saveStream() endRecord() selectInput() saveBytes() createReader() beginRaw() endRaw() PrintWriter delay()").split(" "),Q=R.length,N,S;function P(T){return function(){throw"Processing.js does not support "+T+"."}}while(Q--){N=R[Q];S=N.replace("()","");O[S]=P(N)}})(g);g.defineProperty(g,"screenWidth",{get:function(){return D.innerWidth}});g.defineProperty(g,"screenHeight",{get:function(){return D.innerHeight}});g.defineProperty(g,"online",{get:function(){return true}});var k=[];var J={};var L=function(N){k.splice(J[N],1);delete J[N]};var a=function(N){if(N.externals.canvas.id===t||!N.externals.canvas.id.length){N.externals.canvas.id="__processing"+k.length}J[N.externals.canvas.id]=k.length;k.push(N)};function p(X){var Q=250,ae=X.size/Q,N=d.createElement("canvas");N.width=2*Q;N.height=2*Q;N.style.opacity=0;var W=X.getCSSDefinition(Q+"px","normal"),Y=N.getContext("2d");Y.font=W;var ac="dbflkhyjqpg";N.width=Y.measureText(ac).width;Y.font=W;var T=d.createElement("div");T.style.position="absolute";T.style.opacity=0;T.style.fontFamily='"'+X.name+'"';T.style.fontSize=Q+"px";T.innerHTML=ac+"<br/>"+ac;d.body.appendChild(T);var U=N.width,ab=N.height,V=ab/2;Y.fillStyle="white";Y.fillRect(0,0,U,ab);Y.fillStyle="black";Y.fillText(ac,0,V);var P=Y.getImageData(0,0,U,ab).data;var Z=0,S=U*4,aa=P.length;while(++Z<aa&&P[Z]===255){G()}var R=q.round(Z/S);Z=aa-1;while(--Z>0&&P[Z]===255){G()}var ad=q.round(Z/S);X.ascent=ae*(V-R);X.descent=ae*(ad-V);if(d.defaultView.getComputedStyle){var O=d.defaultView.getComputedStyle(T,null).getPropertyValue("height");O=ae*O.replace("px","");if(O>=X.size*2){X.leading=q.round(O/2)}}d.body.removeChild(T);if(X.caching){return Y}}function H(N,O){if(N===t){N=""}this.name=N;if(O===t){O=0}this.size=O;this.glyph=false;this.ascent=0;this.descent=0;this.leading=1.2*O;var R=N.indexOf(" Italic Bold");if(R!==-1){N=N.substring(0,R)}this.style="normal";var Q=N.indexOf(" Italic");if(Q!==-1){N=N.substring(0,Q);this.style="italic"}this.weight="normal";var P=N.indexOf(" Bold");if(P!==-1){N=N.substring(0,P);this.weight="bold"}this.family="sans-serif";if(N!==t){switch(N){case"sans-serif":case"serif":case"monospace":case"fantasy":case"cursive":this.family=N;break;default:this.family='"'+N+'", sans-serif';break}}this.context2d=p(this);this.css=this.getCSSDefinition();if(this.context2d){this.context2d.font=this.css}}H.prototype.caching=true;H.prototype.getCSSDefinition=function(P,N){if(P===t){P=this.size+"px"}if(N===t){N=this.leading+"px"}var O=[this.style,"normal",this.weight,P+"/"+N,this.family];return O.join(" ")};H.prototype.measureTextWidth=function(N){return this.context2d.measureText(N).width};H.prototype.measureTextWidthFallback=function(P){var O=d.createElement("canvas"),N=O.getContext("2d");N.font=this.css;return N.measureText(P).width};H.PFontCache={length:0};H.get=function(Q,R){R=(R*10+0.5|0)/10;var O=H.PFontCache,N=Q+"/"+R;if(!O[N]){O[N]=new H(Q,R);O.length++;if(O.length===50){H.prototype.measureTextWidth=H.prototype.measureTextWidthFallback;H.prototype.caching=false;var P;for(P in O){if(P!=="length"){O[P].context2d=null}}return new H(Q,R)}if(O.length===400){H.PFontCache={};H.get=H.getFallback;return new H(Q,R)}}return O[N]};H.getFallback=function(N,O){return new H(N,O)};H.list=function(){return["sans-serif","serif","monospace","fantasy","cursive"]};H.preloading={template:{},initialized:false,initialize:function(){var P=function(){var R="#E3KAI2wAgT1MvMg7Eo3VmNtYX7ABi3CxnbHlm7Abw3kaGVhZ7ACs3OGhoZWE7A53CRobXR47AY3AGbG9jYQ7G03Bm1heH7ABC3CBuYW1l7Ae3AgcG9zd7AI3AE#B3AQ2kgTY18PPPUACwAg3ALSRoo3#yld0xg32QAB77#E777773B#E3C#I#Q77773E#Q7777777772CMAIw7AB77732B#M#Q3wAB#g3B#E#E2BB//82BB////w#B7#gAEg3E77x2B32B#E#Q#MTcBAQ32gAe#M#QQJ#E32M#QQJ#I#g32Q77#";var Q=function(S){return"AAAAAAAA".substr(~~S?7-S:6)};return R.replace(/[#237]/g,Q)};var N=d.createElement("style");N.setAttribute("type","text/css");N.innerHTML='@font-face {\n  font-family: "PjsEmptyFont";\n  src: url(\'data:application/x-font-ttf;base64,'+P()+"')\n       format('truetype');\n}";d.head.appendChild(N);var O=d.createElement("span");O.style.cssText='position: absolute; top: 0; left: 0; opacity: 0; font-family: "PjsEmptyFont", fantasy;';O.innerHTML="AAAAAAAA";d.body.appendChild(O);this.template=O;this.initialized=true},getElementWidth:function(N){return d.defaultView.getComputedStyle(N,"").getPropertyValue("width")},timeAttempted:0,pending:function(R){if(!this.initialized){this.initialize()}var P,N,Q=this.getElementWidth(this.template);for(var O=0;O<this.fontList.length;O++){P=this.fontList[O];N=this.getElementWidth(P);if(this.timeAttempted<4000&&N===Q){this.timeAttempted+=R;return true}else{d.body.removeChild(P);this.fontList.splice(O--,1);this.timeAttempted=0}}if(this.fontList.length===0){return false}return true},fontList:[],addedList:{},add:function(N){if(!this.initialized){this.initialize()}var R=typeof N==="object"?N.fontFace:N,Q=typeof N==="object"?N.url:N;if(this.addedList[R]){return}var P=d.createElement("style");P.setAttribute("type","text/css");P.innerHTML="@font-face{\n  font-family: '"+R+"';\n  src:  url('"+Q+"');\n}\n";d.head.appendChild(P);this.addedList[R]=true;var O=d.createElement("span");O.style.cssText="position: absolute; top: 0; left: 0; opacity: 0;";O.style.fontFamily='"'+R+'", "PjsEmptyFont", fantasy';O.innerHTML="AAAAAAAA";d.body.appendChild(O);this.fontList.push(O)}};g.PFont=H;var F=this.Processing=function(be,ba){if(!(this instanceof F)){throw"called Processing constructor as if it were a function: missing 'new'."}var ae,cV=be===t&&ba===t;if(cV){ae=d.createElement("canvas")}else{ae=typeof be==="string"?d.getElementById(be):be}if(!(ae instanceof HTMLCanvasElement)){throw"called Processing constructor without passing canvas element reference or id."}function dw(ea){F.debug("Unimplemented - "+ea)}var cW=this;cW.externals={canvas:ae,context:t,sketch:t};cW.name="Processing.js Instance";cW.use3DContext=false;cW.focused=false;cW.breakShape=false;cW.glyphTable={};cW.pmouseX=0;cW.pmouseY=0;cW.mouseX=0;cW.mouseY=0;cW.mouseButton=0;cW.mouseScroll=0;cW.mouseClicked=t;cW.mouseDragged=t;cW.mouseMoved=t;cW.mousePressed=t;cW.mouseReleased=t;cW.mouseScrolled=t;cW.mouseOver=t;cW.mouseOut=t;cW.touchStart=t;cW.touchEnd=t;cW.touchMove=t;cW.touchCancel=t;cW.key=t;cW.keyCode=t;cW.keyPressed=G;cW.keyReleased=G;cW.keyTyped=G;cW.draw=t;cW.setup=t;cW.__mousePressed=false;cW.__keyPressed=false;cW.__frameRate=60;cW.frameCount=0;cW.width=100;cW.height=100;var d8,cQ,dY,bD=true,aH=true,bo=[1,1,1,1],a1=4294967295,aq=true,ce=true,c0=[0,0,0,1],cv=4278190080,b3=true,dW=1,ax=false,dO=false,aC=true,b4=0,bK=0,cN=3,a8=0,a7=0,a6=0,a2=0,dU=60,az=1000/dU,Z="default",ck=ae.style.cursor,dR=20,cj=0,d6=[],aJ=0,Q=20,cM=false,a4=-3355444,cy=20,bU=255,bJ=255,bI=255,bG=255,cZ=false,aK=false,dN=0,d5=0,cY=1,bf=null,bw=null,a5=false,dq=Date.now(),dt=dq,P=0,cE,c3,aQ,aL,bz,cd,U,dC={attributes:{},locations:{}},dx,dQ,bT,bh,cJ,dk,aB,b2,bg,b8,at,aG,bC,aw,af,c7,bS,cs={width:0,height:0},d4=2,dT=false,cH,ac,R,N=37,c1=0,cI=4,Y="Arial",d0=12,a3=9,dA=2,d7=14,W=H.get(Y,d0),aj,cn=null,dV=false,d3,bZ=1000,ag=[],dI=null,dX=[16,17,18,20,33,34,35,36,37,38,39,40,144,155,112,113,114,115,116,117,118,119,120,121,122,123,157];var ad,dp,aU,bX;if(d.defaultView&&d.defaultView.getComputedStyle){ad=parseInt(d.defaultView.getComputedStyle(ae,null)["paddingLeft"],10)||0;dp=parseInt(d.defaultView.getComputedStyle(ae,null)["paddingTop"],10)||0;aU=parseInt(d.defaultView.getComputedStyle(ae,null)["borderLeftWidth"],10)||0;bX=parseInt(d.defaultView.getComputedStyle(ae,null)["borderTopWidth"],10)||0}var dL=0;var bL=0,bM=0,bt=[],bs=[],br=[],ah=new e(720),bl=new e(720),cF,cA;var bV,ch,dJ,aT,am,da,ab,db,ap=false,ci=false,cK=60*(q.PI/180),dl=cW.width/2,dj=cW.height/2,di=dj/q.tan(cK/2),a0=di/10,av=di*10,b5=cW.width/cW.height;var bb=[],cb=[],c2=0,dP=false,aa=false,du=true;var S=0;var bm=[];var dh=new e([0.5,0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,0.5,0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,0.5,0.5,0.5,-0.5,0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,-0.5,0.5,-0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,0.5,0.5,0.5,0.5]);var bH=new e([0.5,0.5,0.5,0.5,-0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0.5,0.5,-0.5,-0.5,0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5,0.5,0.5,-0.5,0.5]);var df=new e([0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0]);var ak=new e([0,0,0,0,1,0,1,1,0,1,0,0]);var ai=new e([0,0,1,0,0,1,0,0,1,0,0,1]);var aO="varying vec4 vFrontColor;attribute vec3 aVertex;attribute vec4 aColor;uniform mat4 uView;uniform mat4 uProjection;uniform float uPointSize;void main(void) {  vFrontColor = aColor;  gl_PointSize = uPointSize;  gl_Position = uProjection * uView * vec4(aVertex, 1.0);}";var bQ="#ifdef GL_ES\nprecision highp float;\n#endif\nvarying vec4 vFrontColor;uniform bool uSmooth;void main(void){  if(uSmooth == true){    float dist = distance(gl_PointCoord, vec2(0.5));    if(dist > 0.5){      discard;    }  }  gl_FragColor = vFrontColor;}";var dE="varying vec4 vFrontColor;attribute vec3 aVertex;attribute vec2 aTextureCoord;uniform vec4 uColor;uniform mat4 uModel;uniform mat4 uView;uniform mat4 uProjection;uniform float uPointSize;varying vec2 vTextureCoord;void main(void) {  gl_PointSize = uPointSize;  vFrontColor = uColor;  gl_Position = uProjection * uView * uModel * vec4(aVertex, 1.0);  vTextureCoord = aTextureCoord;}";var aW="#ifdef GL_ES\nprecision highp float;\n#endif\nvarying vec4 vFrontColor;varying vec2 vTextureCoord;uniform sampler2D uSampler;uniform int uIsDrawingText;uniform bool uSmooth;void main(void){  if(uSmooth == true){    float dist = distance(gl_PointCoord, vec2(0.5));    if(dist > 0.5){      discard;    }  }  if(uIsDrawingText == 1){    float alpha = texture2D(uSampler, vTextureCoord).a;    gl_FragColor = vec4(vFrontColor.rgb * alpha, alpha);  }  else{    gl_FragColor = vFrontColor;  }}";var bA=/Windows/.test(navigator.userAgent);var dn="varying vec4 vFrontColor;attribute vec3 aVertex;attribute vec3 aNormal;attribute vec4 aColor;attribute vec2 aTexture;varying   vec2 vTexture;uniform vec4 uColor;uniform bool uUsingMat;uniform vec3 uSpecular;uniform vec3 uMaterialEmissive;uniform vec3 uMaterialAmbient;uniform vec3 uMaterialSpecular;uniform float uShininess;uniform mat4 uModel;uniform mat4 uView;uniform mat4 uProjection;uniform mat4 uNormalTransform;uniform int uLightCount;uniform vec3 uFalloff;struct Light {  int type;  vec3 color;  vec3 position;  vec3 direction;  float angle;  vec3 halfVector;  float concentration;};uniform Light uLights0;uniform Light uLights1;uniform Light uLights2;uniform Light uLights3;uniform Light uLights4;uniform Light uLights5;uniform Light uLights6;uniform Light uLights7;Light getLight(int index){  if(index == 0) return uLights0;  if(index == 1) return uLights1;  if(index == 2) return uLights2;  if(index == 3) return uLights3;  if(index == 4) return uLights4;  if(index == 5) return uLights5;  if(index == 6) return uLights6;  return uLights7;}void AmbientLight( inout vec3 totalAmbient, in vec3 ecPos, in Light light ) {  float d = length( light.position - ecPos );  float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ));  totalAmbient += light.color * attenuation;}void DirectionalLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {  float powerFactor = 0.0;  float nDotVP = max(0.0, dot( vertNormal, normalize(-light.position) ));  float nDotVH = max(0.0, dot( vertNormal, normalize(-light.position-normalize(ecPos) )));  if( nDotVP != 0.0 ){    powerFactor = pow( nDotVH, uShininess );  }  col += light.color * nDotVP;  spec += uSpecular * powerFactor;}void PointLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {  float powerFactor;   vec3 VP = light.position - ecPos;  float d = length( VP );   VP = normalize( VP );  float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ));  float nDotVP = max( 0.0, dot( vertNormal, VP ));  vec3 halfVector = normalize( VP - normalize(ecPos) );  float nDotHV = max( 0.0, dot( vertNormal, halfVector ));  if( nDotVP == 0.0 ) {    powerFactor = 0.0;  }  else {    powerFactor = pow( nDotHV, uShininess );  }  spec += uSpecular * powerFactor * attenuation;  col += light.color * nDotVP * attenuation;}void SpotLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {  float spotAttenuation;  float powerFactor = 0.0;  vec3 VP = light.position - ecPos;  vec3 ldir = normalize( -light.direction );  float d = length( VP );  VP = normalize( VP );  float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ) );  float spotDot = dot( VP, ldir );"+(bA?"  spotAttenuation = 1.0; ":"  if( spotDot > cos( light.angle ) ) {    spotAttenuation = pow( spotDot, light.concentration );  }  else{    spotAttenuation = 0.0;  }  attenuation *= spotAttenuation;")+"  float nDotVP = max( 0.0, dot( vertNormal, VP ) );  vec3 halfVector = normalize( VP - normalize(ecPos) );  float nDotHV = max( 0.0, dot( vertNormal, halfVector ) );  if( nDotVP != 0.0 ) {    powerFactor = pow( nDotHV, uShininess );  }  spec += uSpecular * powerFactor * attenuation;  col += light.color * nDotVP * attenuation;}void main(void) {  vec3 finalAmbient = vec3( 0.0 );  vec3 finalDiffuse = vec3( 0.0 );  vec3 finalSpecular = vec3( 0.0 );  vec4 col = uColor;  if ( uColor[0] == -1.0 ){    col = aColor;  }  vec3 norm = normalize(vec3( uNormalTransform * vec4( aNormal, 0.0 ) ));  vec4 ecPos4 = uView * uModel * vec4(aVertex, 1.0);  vec3 ecPos = (vec3(ecPos4))/ecPos4.w;  if( uLightCount == 0 ) {    vFrontColor = col + vec4(uMaterialSpecular, 1.0);  }  else {    for( int i = 0; i < 8; i++ ) {      Light l = getLight(i);      if( i >= uLightCount ){        break;      }      if( l.type == 0 ) {        AmbientLight( finalAmbient, ecPos, l );      }      else if( l.type == 1 ) {        DirectionalLight( finalDiffuse, finalSpecular, norm, ecPos, l );      }      else if( l.type == 2 ) {        PointLight( finalDiffuse, finalSpecular, norm, ecPos, l );      }      else {        SpotLight( finalDiffuse, finalSpecular, norm, ecPos, l );      }    }   if( uUsingMat == false ) {     vFrontColor = vec4(       vec3( col ) * finalAmbient +       vec3( col ) * finalDiffuse +       vec3( col ) * finalSpecular,       col[3] );   }   else{     vFrontColor = vec4(        uMaterialEmissive +        (vec3(col) * uMaterialAmbient * finalAmbient ) +        (vec3(col) * finalDiffuse) +        (uMaterialSpecular * finalSpecular),        col[3] );    }  }  vTexture.xy = aTexture.xy;  gl_Position = uProjection * uView * uModel * vec4( aVertex, 1.0 );}";var aF="#ifdef GL_ES\nprecision highp float;\n#endif\nvarying vec4 vFrontColor;uniform sampler2D uSampler;uniform bool uUsingTexture;varying vec2 vTexture;void main(void){  if( uUsingTexture ){    gl_FragColor = vec4(texture2D(uSampler, vTexture.xy)) * vFrontColor;  }  else{    gl_FragColor = vFrontColor;  }}";function d2(ec,eb,ee,ed){var ea=dC.locations[ec];if(ea===t){ea=d8.getUniformLocation(eb,ee);dC.locations[ec]=ea}if(ea!==null){if(ed.length===4){d8.uniform4fv(ea,ed)}else{if(ed.length===3){d8.uniform3fv(ea,ed)}else{if(ed.length===2){d8.uniform2fv(ea,ed)}else{d8.uniform1f(ea,ed)}}}}}function dZ(ec,eb,ee,ed){var ea=dC.locations[ec];if(ea===t){ea=d8.getUniformLocation(eb,ee);dC.locations[ec]=ea}if(ea!==null){if(ed.length===4){d8.uniform4iv(ea,ed)}else{if(ed.length===3){d8.uniform3iv(ea,ed)}else{if(ed.length===2){d8.uniform2iv(ea,ed)}else{d8.uniform1i(ea,ed)}}}}}function a9(ee,ec,ef,ed,eb){var ea=dC.locations[ee];if(ea===t){ea=d8.getUniformLocation(ec,ef);dC.locations[ee]=ea}if(ea!==-1){if(eb.length===16){d8.uniformMatrix4fv(ea,ed,eb)}else{if(eb.length===9){d8.uniformMatrix3fv(ea,ed,eb)}else{d8.uniformMatrix2fv(ea,ed,eb)}}}}function dc(ee,ec,ef,eb,ed){var ea=dC.attributes[ee];if(ea===t){ea=d8.getAttribLocation(ec,ef);dC.attributes[ee]=ea}if(ea!==-1){d8.bindBuffer(d8.ARRAY_BUFFER,ed);d8.vertexAttribPointer(ea,eb,d8.FLOAT,false,0,0);d8.enableVertexAttribArray(ea)}}function cg(ec,eb,ed){var ea=dC.attributes[ec];if(ea===t){ea=d8.getAttribLocation(eb,ed);dC.attributes[ec]=ea}if(ea!==-1){d8.disableVertexAttribArray(ea)}}var bF=function(ec,ee,eb){var ef=ec.createShader(ec.VERTEX_SHADER);ec.shaderSource(ef,ee);ec.compileShader(ef);if(!ec.getShaderParameter(ef,ec.COMPILE_STATUS)){throw ec.getShaderInfoLog(ef)}var ed=ec.createShader(ec.FRAGMENT_SHADER);ec.shaderSource(ed,eb);ec.compileShader(ed);if(!ec.getShaderParameter(ed,ec.COMPILE_STATUS)){throw ec.getShaderInfoLog(ed)}var ea=ec.createProgram();ec.attachShader(ea,ef);ec.attachShader(ea,ed);ec.linkProgram(ea);if(!ec.getProgramParameter(ea,ec.LINK_STATUS)){throw"Error linking shaders."}return ea};var aZ=function(ea,ee,eb,ed,ec){return{x:ea,y:ee,w:eb,h:ed}};var bk=aZ;var b1=function(ea,ee,eb,ed,ec){return{x:ea,y:ee,w:ec?eb:eb-ea,h:ec?ed:ed-ee}};var aN=function(ea,ee,eb,ed,ec){return{x:ea-eb/2,y:ee-ed/2,w:eb,h:ed}};var ds=function(){};var bR=function(){};var bB=function(){};var ca=function(){};bR.prototype=new ds;bR.prototype.constructor=bR;bB.prototype=new ds;bB.prototype.constructor=bB;ca.prototype=new ds;ca.prototype.constructor=ca;ds.prototype.a3DOnlyFunction=G;var cl={};var bP=cW.Character=function(ea){if(typeof ea==="string"&&ea.length===1){this.code=ea.charCodeAt(0)}else{if(typeof ea==="number"){this.code=ea}else{if(ea instanceof bP){this.code=ea}else{this.code=NaN}}}return cl[this.code]===t?cl[this.code]=this:cl[this.code]};bP.prototype.toString=function(){return String.fromCharCode(this.code)};bP.prototype.valueOf=function(){return this.code};var O=cW.PShape=function(ea){this.family=ea||0;this.visible=true;this.style=true;this.children=[];this.nameTable=[];this.params=[];this.name="";this.image=null;this.matrix=null;this.kind=null;this.close=null;this.width=null;this.height=null;this.parent=null};O.prototype={isVisible:function(){return this.visible},setVisible:function(ea){this.visible=ea},disableStyle:function(){this.style=false;for(var eb=0,ea=this.children.length;eb<ea;eb++){this.children[eb].disableStyle()}},enableStyle:function(){this.style=true;for(var eb=0,ea=this.children.length;eb<ea;eb++){this.children[eb].enableStyle()}},getFamily:function(){return this.family},getWidth:function(){return this.width},getHeight:function(){return this.height},setName:function(ea){this.name=ea},getName:function(){return this.name},draw:function(ea){ea=ea||cW;if(this.visible){this.pre(ea);this.drawImpl(ea);this.post(ea)}},drawImpl:function(ea){if(this.family===0){this.drawGroup(ea)}else{if(this.family===1){this.drawPrimitive(ea)}else{if(this.family===3){this.drawGeometry(ea)}else{if(this.family===21){this.drawPath(ea)}}}}},drawPath:function(ec){var ed,eb;if(this.vertices.length===0){return}ec.beginShape();if(this.vertexCodes.length===0){if(this.vertices[0].length===2){for(ed=0,eb=this.vertices.length;ed<eb;ed++){ec.vertex(this.vertices[ed][0],this.vertices[ed][1])}}else{for(ed=0,eb=this.vertices.length;ed<eb;ed++){ec.vertex(this.vertices[ed][0],this.vertices[ed][1],this.vertices[ed][2])}}}else{var ea=0;if(this.vertices[0].length===2){for(ed=0,eb=this.vertexCodes.length;ed<eb;ed++){if(this.vertexCodes[ed]===0){ec.vertex(this.vertices[ea][0],this.vertices[ea][1],this.vertices[ea]["moveTo"]);ec.breakShape=false;ea++}else{if(this.vertexCodes[ed]===1){ec.bezierVertex(this.vertices[ea+0][0],this.vertices[ea+0][1],this.vertices[ea+1][0],this.vertices[ea+1][1],this.vertices[ea+2][0],this.vertices[ea+2][1]);ea+=3}else{if(this.vertexCodes[ed]===2){ec.curveVertex(this.vertices[ea][0],this.vertices[ea][1]);ea++}else{if(this.vertexCodes[ed]===3){ec.breakShape=true}}}}}}else{for(ed=0,eb=this.vertexCodes.length;ed<eb;ed++){if(this.vertexCodes[ed]===0){ec.vertex(this.vertices[ea][0],this.vertices[ea][1],this.vertices[ea][2]);if(this.vertices[ea]["moveTo"]===true){bb[bb.length-1]["moveTo"]=true}else{if(this.vertices[ea]["moveTo"]===false){bb[bb.length-1]["moveTo"]=false}}ec.breakShape=false}else{if(this.vertexCodes[ed]===1){ec.bezierVertex(this.vertices[ea+0][0],this.vertices[ea+0][1],this.vertices[ea+0][2],this.vertices[ea+1][0],this.vertices[ea+1][1],this.vertices[ea+1][2],this.vertices[ea+2][0],this.vertices[ea+2][1],this.vertices[ea+2][2]);ea+=3}else{if(this.vertexCodes[ed]===2){ec.curveVertex(this.vertices[ea][0],this.vertices[ea][1],this.vertices[ea][2]);ea++}else{if(this.vertexCodes[ed]===3){ec.breakShape=true}}}}}}}ec.endShape(this.close?2:1)},drawGeometry:function(ec){var ed,eb;ec.beginShape(this.kind);if(this.style){for(ed=0,eb=this.vertices.length;ed<eb;ed++){ec.vertex(this.vertices[ed])}}else{for(ed=0,eb=this.vertices.length;ed<eb;ed++){var ea=this.vertices[ed];if(ea[2]===0){ec.vertex(ea[0],ea[1])}else{ec.vertex(ea[0],ea[1],ea[2])}}}ec.endShape()},drawGroup:function(eb){for(var ec=0,ea=this.children.length;ec<ea;ec++){this.children[ec].draw(eb)}},drawPrimitive:function(ea){if(this.kind===2){ea.point(this.params[0],this.params[1])}else{if(this.kind===4){if(this.params.length===4){ea.line(this.params[0],this.params[1],this.params[2],this.params[3])}else{ea.line(this.params[0],this.params[1],this.params[2],this.params[3],this.params[4],this.params[5])}}else{if(this.kind===8){ea.triangle(this.params[0],this.params[1],this.params[2],this.params[3],this.params[4],this.params[5])}else{if(this.kind===16){ea.quad(this.params[0],this.params[1],this.params[2],this.params[3],this.params[4],this.params[5],this.params[6],this.params[7])}else{if(this.kind===30){if(this.image!==null){var ee=bk;ea.imageMode(0);ea.image(this.image,this.params[0],this.params[1],this.params[2],this.params[3]);bk=ee}else{var eb=bK;ea.rectMode(0);ea.rect(this.params[0],this.params[1],this.params[2],this.params[3]);bK=eb}}else{if(this.kind===31){var ec=cN;ea.ellipseMode(0);ea.ellipse(this.params[0],this.params[1],this.params[2],this.params[3]);cN=ec}else{if(this.kind===32){var ed=cN;ea.ellipseMode(0);ea.arc(this.params[0],this.params[1],this.params[2],this.params[3],this.params[4],this.params[5]);cN=ed}else{if(this.kind===41){if(this.params.length===1){ea.box(this.params[0])}else{ea.box(this.params[0],this.params[1],this.params[2])}}else{if(this.kind===40){ea.sphere(this.params[0])}}}}}}}}}},pre:function(ea){if(this.matrix){ea.pushMatrix();ea.transform(this.matrix)}if(this.style){ea.pushStyle();this.styles(ea)}},post:function(ea){if(this.matrix){ea.popMatrix()}if(this.style){ea.popStyle()}},styles:function(ea){if(this.stroke){ea.stroke(this.strokeColor);ea.strokeWeight(this.strokeWeight);ea.strokeCap(this.strokeCap);ea.strokeJoin(this.strokeJoin)}else{ea.noStroke()}if(this.fill){ea.fill(this.fillColor)}else{ea.noFill()}},getChild:function(ed){var eb,ea;if(typeof ed==="number"){return this.children[ed]}var ec;if(ed===""||this.name===ed){return this}if(this.nameTable.length>0){for(eb=0,ea=this.nameTable.length;eb<ea||ec;eb++){if(this.nameTable[eb].getName===ed){ec=this.nameTable[eb];break}}if(ec){return ec}}for(eb=0,ea=this.children.length;eb<ea;eb++){ec=this.children[eb].getChild(ed);if(ec){return ec}}return null},getChildCount:function(){return this.children.length},addChild:function(ea){this.children.push(ea);ea.parent=this;if(ea.getName()!==null){this.addName(ea.getName(),ea)}},addName:function(eb,ea){if(this.parent!==null){this.parent.addName(eb,ea)}else{this.nameTable.push([eb,ea])}},translate:function(){if(arguments.length===2){this.checkMatrix(2);this.matrix.translate(arguments[0],arguments[1])}else{this.checkMatrix(3);this.matrix.translate(arguments[0],arguments[1],0)}},checkMatrix:function(ea){if(this.matrix===null){if(ea===2){this.matrix=new cW.PMatrix2D}else{this.matrix=new cW.PMatrix3D}}else{if(ea===3&&this.matrix instanceof cW.PMatrix2D){this.matrix=new cW.PMatrix3D}}},rotateX:function(ea){this.rotate(ea,1,0,0)},rotateY:function(ea){this.rotate(ea,0,1,0)},rotateZ:function(ea){this.rotate(ea,0,0,1)},rotate:function(){if(arguments.length===1){this.checkMatrix(2);this.matrix.rotate(arguments[0])}else{this.checkMatrix(3);this.matrix.rotate(arguments[0],arguments[1],arguments[2],arguments[3])}},scale:function(){if(arguments.length===2){this.checkMatrix(2);this.matrix.scale(arguments[0],arguments[1])}else{if(arguments.length===3){this.checkMatrix(2);this.matrix.scale(arguments[0],arguments[1],arguments[2])}else{this.checkMatrix(2);this.matrix.scale(arguments[0])}}},resetMatrix:function(){this.checkMatrix(2);this.matrix.reset()},applyMatrix:function(ea){if(arguments.length===1){this.applyMatrix(ea.elements[0],ea.elements[1],0,ea.elements[2],ea.elements[3],ea.elements[4],0,ea.elements[5],0,0,1,0,0,0,0,1)}else{if(arguments.length===6){this.checkMatrix(2);this.matrix.apply(arguments[0],arguments[1],arguments[2],0,arguments[3],arguments[4],arguments[5],0,0,0,1,0,0,0,0,1)}else{if(arguments.length===16){this.checkMatrix(3);this.matrix.apply(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5],arguments[6],arguments[7],arguments[8],arguments[9],arguments[10],arguments[11],arguments[12],arguments[13],arguments[14],arguments[15])}}}}};var cr=cW.PShapeSVG=function(){cW.PShape.call(this);if(arguments.length===1){this.element=arguments[0];this.vertexCodes=[];this.vertices=[];this.opacity=1;this.stroke=false;this.strokeColor=4278190080;this.strokeWeight=1;this.strokeCap="butt";this.strokeJoin="miter";this.strokeGradient=null;this.strokeGradientPaint=null;this.strokeName=null;this.strokeOpacity=1;this.fill=true;this.fillColor=4278190080;this.fillGradient=null;this.fillGradientPaint=null;this.fillName=null;this.fillOpacity=1;if(this.element.getName()!=="svg"){throw"root is not <svg>, it's <"+this.element.getName()+">"}}else{if(arguments.length===2){if(typeof arguments[1]==="string"){if(arguments[1].indexOf(".svg")>-1){this.element=new cW.XMLElement(cW,arguments[1]);this.vertexCodes=[];this.vertices=[];this.opacity=1;this.stroke=false;this.strokeColor=4278190080;this.strokeWeight=1;this.strokeCap="butt";this.strokeJoin="miter";this.strokeGradient="";this.strokeGradientPaint="";this.strokeName="";this.strokeOpacity=1;this.fill=true;this.fillColor=4278190080;this.fillGradient=null;this.fillGradientPaint=null;this.fillOpacity=1}}else{if(arguments[0]){this.element=arguments[1];this.vertexCodes=arguments[0].vertexCodes.slice();this.vertices=arguments[0].vertices.slice();this.stroke=arguments[0].stroke;this.strokeColor=arguments[0].strokeColor;this.strokeWeight=arguments[0].strokeWeight;this.strokeCap=arguments[0].strokeCap;this.strokeJoin=arguments[0].strokeJoin;this.strokeGradient=arguments[0].strokeGradient;this.strokeGradientPaint=arguments[0].strokeGradientPaint;this.strokeName=arguments[0].strokeName;this.fill=arguments[0].fill;this.fillColor=arguments[0].fillColor;this.fillGradient=arguments[0].fillGradient;this.fillGradientPaint=arguments[0].fillGradientPaint;this.fillName=arguments[0].fillName;this.strokeOpacity=arguments[0].strokeOpacity;this.fillOpacity=arguments[0].fillOpacity;this.opacity=arguments[0].opacity}}}}this.name=this.element.getStringAttribute("id");var ea=this.element.getStringAttribute("display","inline");this.visible=ea!=="none";var ef=this.element.getAttribute("transform");if(ef){this.matrix=this.parseMatrix(ef)}var ec=this.element.getStringAttribute("viewBox");if(ec!==null){var ee=ec.split(" ");this.width=ee[2];this.height=ee[3]}var eb=this.element.getStringAttribute("width");var ed=this.element.getStringAttribute("height");if(eb!==null){this.width=this.parseUnitSize(eb);this.height=this.parseUnitSize(ed)}else{if(this.width===0||this.height===0){this.width=1;this.height=1;throw"The width and/or height is not readable in the <svg> tag of this file."}}this.parseColors(this.element);this.parseChildren(this.element)};cr.prototype=new O;cr.prototype.parseMatrix=function(){function ea(ec){var eb=[];ec.replace(/\((.*?)\)/,function(){return function(ed,ee){eb=ee.replace(/,+/g," ").split(/\s+/)}}());return eb}return function(ei){this.checkMatrix(2);var eb=[];ei.replace(/\s*(\w+)\((.*?)\)/g,function(el){eb.push(cW.trim(el))});if(eb.length===0){return null}for(var eg=0,ee=eb.length;eg<ee;eg++){var ec=ea(eb[eg]);if(eb[eg].indexOf("matrix")!==-1){this.matrix.set(ec[0],ec[2],ec[4],ec[1],ec[3],ec[5])}else{if(eb[eg].indexOf("translate")!==-1){var eh=ec[0];var ef=ec.length===2?ec[1]:0;this.matrix.translate(eh,ef)}else{if(eb[eg].indexOf("scale")!==-1){var ek=ec[0];var ej=ec.length===2?ec[1]:ec[0];this.matrix.scale(ek,ej)}else{if(eb[eg].indexOf("rotate")!==-1){var ed=ec[0];if(ec.length===1){this.matrix.rotate(cW.radians(ed))}else{if(ec.length===3){this.matrix.translate(ec[1],ec[2]);this.matrix.rotate(cW.radians(ec[0]));this.matrix.translate(-ec[1],-ec[2])}}}else{if(eb[eg].indexOf("skewX")!==-1){this.matrix.skewX(parseFloat(ec[0]))}else{if(eb[eg].indexOf("skewY")!==-1){this.matrix.skewY(ec[0])}else{if(eb[eg].indexOf("shearX")!==-1){this.matrix.shearX(ec[0])}else{if(eb[eg].indexOf("shearY")!==-1){this.matrix.shearY(ec[0])}}}}}}}}}return this.matrix}}();cr.prototype.parseChildren=function(ef){var eb=ef.getChildren();var ee=new cW.PShape;for(var ed=0,ec=eb.length;ed<ec;ed++){var ea=this.parseChild(eb[ed]);if(ea){ee.addChild(ea)}}this.children.push(ee)};cr.prototype.getName=function(){return this.name};cr.prototype.parseChild=function(ec){var eb=ec.getName();var ea;if(eb==="g"){ea=new cr(this,ec)}else{if(eb==="defs"){ea=new cr(this,ec)}else{if(eb==="line"){ea=new cr(this,ec);ea.parseLine()}else{if(eb==="circle"){ea=new cr(this,ec);ea.parseEllipse(true)}else{if(eb==="ellipse"){ea=new cr(this,ec);ea.parseEllipse(false)}else{if(eb==="rect"){ea=new cr(this,ec);ea.parseRect()}else{if(eb==="polygon"){ea=new cr(this,ec);ea.parsePoly(true)}else{if(eb==="polyline"){ea=new cr(this,ec);ea.parsePoly(false)}else{if(eb==="path"){ea=new cr(this,ec);ea.parsePath()}else{if(eb==="radialGradient"){dw("PShapeSVG.prototype.parseChild, name = radialGradient")}else{if(eb==="linearGradient"){dw("PShapeSVG.prototype.parseChild, name = linearGradient")}else{if(eb==="text"){dw("PShapeSVG.prototype.parseChild, name = text")}else{if(eb==="filter"){dw("PShapeSVG.prototype.parseChild, name = filter")}else{if(eb==="mask"){dw("PShapeSVG.prototype.parseChild, name = mask")}else{G()}}}}}}}}}}}}}}return ea};cr.prototype.parsePath=function(){this.family=21;this.kind=0;var ef=[];var ez;var ey=cW.trim(this.element.getStringAttribute("d").replace(/[\s,]+/g," "));if(ey===null){return}ey=cW.__toCharArray(ey);var ed=0,ec=0,ek=0,ei=0,ej=0,eh=0,eq=0,ep=0,eb=0,ea=0,em=0,el=0,eo=0,en=0,ex=0,et=0;var er="";var ev=[];var ew=false;var eg;var ee;var eu,es;while(ex<ey.length){et=ey[ex].valueOf();if(et>=65&&et<=90||et>=97&&et<=122){eu=ex;ex++;if(ex<ey.length){ev=[];et=ey[ex].valueOf();while(!(et>=65&&et<=90||et>=97&&et<=100||et>=102&&et<=122)&&ew===false){if(et===32){if(er!==""){ev.push(parseFloat(er));er=""}ex++}else{if(et===45){if(ey[ex-1].valueOf()===101){er+=ey[ex].toString();ex++}else{if(er!==""){ev.push(parseFloat(er))}er=ey[ex].toString();ex++}}else{er+=ey[ex].toString();ex++}}if(ex===ey.length){ew=true}else{et=ey[ex].valueOf()}}}if(er!==""){ev.push(parseFloat(er));er=""}ee=ey[eu];et=ee.valueOf();if(et===77){if(ev.length>=2&&ev.length%2===0){ed=ev[0];ec=ev[1];this.parsePathMoveto(ed,ec);if(ev.length>2){for(eu=2,es=ev.length;eu<es;eu+=2){ed=ev[eu];ec=ev[eu+1];this.parsePathLineto(ed,ec)}}}}else{if(et===109){if(ev.length>=2&&ev.length%2===0){ed+=ev[0];ec+=ev[1];this.parsePathMoveto(ed,ec);if(ev.length>2){for(eu=2,es=ev.length;eu<es;eu+=2){ed+=ev[eu];ec+=ev[eu+1];this.parsePathLineto(ed,ec)}}}}else{if(et===76){if(ev.length>=2&&ev.length%2===0){for(eu=0,es=ev.length;eu<es;eu+=2){ed=ev[eu];ec=ev[eu+1];this.parsePathLineto(ed,ec)}}}else{if(et===108){if(ev.length>=2&&ev.length%2===0){for(eu=0,es=ev.length;eu<es;eu+=2){ed+=ev[eu];ec+=ev[eu+1];this.parsePathLineto(ed,ec)}}}else{if(et===72){for(eu=0,es=ev.length;eu<es;eu++){ed=ev[eu];this.parsePathLineto(ed,ec)}}else{if(et===104){for(eu=0,es=ev.length;eu<es;eu++){ed+=ev[eu];this.parsePathLineto(ed,ec)}}else{if(et===86){for(eu=0,es=ev.length;eu<es;eu++){ec=ev[eu];this.parsePathLineto(ed,ec)}}else{if(et===118){for(eu=0,es=ev.length;eu<es;eu++){ec+=ev[eu];this.parsePathLineto(ed,ec)}}else{if(et===67){if(ev.length>=6&&ev.length%6===0){for(eu=0,es=ev.length;eu<es;eu+=6){ej=ev[eu];eq=ev[eu+1];eh=ev[eu+2];ep=ev[eu+3];eb=ev[eu+4];ea=ev[eu+5];this.parsePathCurveto(ej,eq,eh,ep,eb,ea);ed=eb;ec=ea}}}else{if(et===99){if(ev.length>=6&&ev.length%6===0){for(eu=0,es=ev.length;eu<es;eu+=6){ej=ed+ev[eu];eq=ec+ev[eu+1];eh=ed+ev[eu+2];ep=ec+ev[eu+3];eb=ed+ev[eu+4];ea=ec+ev[eu+5];this.parsePathCurveto(ej,eq,eh,ep,eb,ea);ed=eb;ec=ea}}}else{if(et===83){if(ev.length>=4&&ev.length%4===0){for(eu=0,es=ev.length;eu<es;eu+=4){if(eg.toLowerCase()==="c"||eg.toLowerCase()==="s"){em=this.vertices[this.vertices.length-2][0];el=this.vertices[this.vertices.length-2][1];eo=this.vertices[this.vertices.length-1][0];en=this.vertices[this.vertices.length-1][1];ej=eo+(eo-em);eq=en+(en-el)}else{ej=this.vertices[this.vertices.length-1][0];eq=this.vertices[this.vertices.length-1][1]}eh=ev[eu];ep=ev[eu+1];eb=ev[eu+2];ea=ev[eu+3];this.parsePathCurveto(ej,eq,eh,ep,eb,ea);ed=eb;ec=ea}}}else{if(et===115){if(ev.length>=4&&ev.length%4===0){for(eu=0,es=ev.length;eu<es;eu+=4){if(eg.toLowerCase()==="c"||eg.toLowerCase()==="s"){em=this.vertices[this.vertices.length-2][0];el=this.vertices[this.vertices.length-2][1];eo=this.vertices[this.vertices.length-1][0];en=this.vertices[this.vertices.length-1][1];ej=eo+(eo-em);eq=en+(en-el)}else{ej=this.vertices[this.vertices.length-1][0];eq=this.vertices[this.vertices.length-1][1]}eh=ed+ev[eu];ep=ec+ev[eu+1];eb=ed+ev[eu+2];ea=ec+ev[eu+3];this.parsePathCurveto(ej,eq,eh,ep,eb,ea);ed=eb;ec=ea}}}else{if(et===81){if(ev.length>=4&&ev.length%4===0){for(eu=0,es=ev.length;eu<es;eu+=4){ek=ev[eu];ei=ev[eu+1];eb=ev[eu+2];ea=ev[eu+3];this.parsePathQuadto(ed,ec,ek,ei,eb,ea);ed=eb;ec=ea}}}else{if(et===113){if(ev.length>=4&&ev.length%4===0){for(eu=0,es=ev.length;eu<es;eu+=4){ek=ed+ev[eu];ei=ec+ev[eu+1];eb=ed+ev[eu+2];ea=ec+ev[eu+3];this.parsePathQuadto(ed,ec,ek,ei,eb,ea);ed=eb;ec=ea}}}else{if(et===84){if(ev.length>=2&&ev.length%2===0){for(eu=0,es=ev.length;eu<es;eu+=2){if(eg.toLowerCase()==="q"||eg.toLowerCase()==="t"){em=this.vertices[this.vertices.length-2][0];el=this.vertices[this.vertices.length-2][1];eo=this.vertices[this.vertices.length-1][0];en=this.vertices[this.vertices.length-1][1];ek=eo+(eo-em);ei=en+(en-el)}else{ek=ed;ei=ec}eb=ev[eu];ea=ev[eu+1];this.parsePathQuadto(ed,ec,ek,ei,eb,ea);ed=eb;ec=ea}}}else{if(et===116){if(ev.length>=2&&ev.length%2===0){for(eu=0,es=ev.length;eu<es;eu+=2){if(eg.toLowerCase()==="q"||eg.toLowerCase()==="t"){em=this.vertices[this.vertices.length-2][0];el=this.vertices[this.vertices.length-2][1];eo=this.vertices[this.vertices.length-1][0];en=this.vertices[this.vertices.length-1][1];ek=eo+(eo-em);ei=en+(en-el)}else{ek=ed;ei=ec}eb=ed+ev[eu];ea=ec+ev[eu+1];this.parsePathQuadto(ed,ec,ek,ei,eb,ea);ed=eb;ec=ea}}}else{if(et===90||et===122){this.close=true}}}}}}}}}}}}}}}}}eg=ee.toString()}else{ex++}}};cr.prototype.parsePathQuadto=function(ec,ee,ea,ef,eb,ed){if(this.vertices.length>0){this.parsePathCode(1);this.parsePathVertex(ec+(ea-ec)*2/3,ee+(ef-ee)*2/3);this.parsePathVertex(eb+(ea-eb)*2/3,ed+(ef-ed)*2/3);this.parsePathVertex(eb,ed)}else{throw"Path must start with M/m"}};cr.prototype.parsePathCurveto=function(ed,ef,eb,ee,ea,ec){if(this.vertices.length>0){this.parsePathCode(1);this.parsePathVertex(ed,ef);this.parsePathVertex(eb,ee);this.parsePathVertex(ea,ec)}else{throw"Path must start with M/m"}};cr.prototype.parsePathLineto=function(eb,ea){if(this.vertices.length>0){this.parsePathCode(0);this.parsePathVertex(eb,ea);this.vertices[this.vertices.length-1]["moveTo"]=false}else{throw"Path must start with M/m"}};cr.prototype.parsePathMoveto=function(eb,ea){if(this.vertices.length>0){this.parsePathCode(3)}this.parsePathCode(0);this.parsePathVertex(eb,ea);this.vertices[this.vertices.length-1]["moveTo"]=true};cr.prototype.parsePathVertex=function(ea,ec){var eb=[];eb[0]=ea;eb[1]=ec;this.vertices.push(eb)};cr.prototype.parsePathCode=function(ea){this.vertexCodes.push(ea)};cr.prototype.parsePoly=function(ee){this.family=21;this.close=ee;var eb=cW.trim(this.element.getStringAttribute("points").replace(/[,\s]+/g," "));if(eb!==null){var ea=eb.split(" ");if(ea.length%2===0){for(var ed=0,ec=ea.length;ed<ec;ed++){var ef=[];ef[0]=ea[ed];ef[1]=ea[++ed];this.vertices.push(ef)}}else{throw"Error parsing polygon points: odd number of coordinates provided"}}};cr.prototype.parseRect=function(){this.kind=30;this.family=1;this.params=[];this.params[0]=this.element.getFloatAttribute("x");this.params[1]=this.element.getFloatAttribute("y");this.params[2]=this.element.getFloatAttribute("width");this.params[3]=this.element.getFloatAttribute("height");if(this.params[2]<0||this.params[3]<0){throw"svg error: negative width or height found while parsing <rect>"}};cr.prototype.parseEllipse=function(ec){this.kind=31;this.family=1;this.params=[];this.params[0]=this.element.getFloatAttribute("cx")|0;this.params[1]=this.element.getFloatAttribute("cy")|0;var eb,ea;if(ec){eb=ea=this.element.getFloatAttribute("r");if(eb<0){throw"svg error: negative radius found while parsing <circle>"}}else{eb=this.element.getFloatAttribute("rx");ea=this.element.getFloatAttribute("ry");if(eb<0||ea<0){throw"svg error: negative x-axis radius or y-axis radius found while parsing <ellipse>"}}this.params[0]-=eb;this.params[1]-=ea;this.params[2]=eb*2;this.params[3]=ea*2};cr.prototype.parseLine=function(){this.kind=4;this.family=1;this.params=[];this.params[0]=this.element.getFloatAttribute("x1");this.params[1]=this.element.getFloatAttribute("y1");this.params[2]=this.element.getFloatAttribute("x2");this.params[3]=this.element.getFloatAttribute("y2")};cr.prototype.parseColors=function(ec){if(ec.hasAttribute("opacity")){this.setOpacity(ec.getAttribute("opacity"))}if(ec.hasAttribute("stroke")){this.setStroke(ec.getAttribute("stroke"))}if(ec.hasAttribute("stroke-width")){this.setStrokeWeight(ec.getAttribute("stroke-width"))}if(ec.hasAttribute("stroke-linejoin")){this.setStrokeJoin(ec.getAttribute("stroke-linejoin"))}if(ec.hasAttribute("stroke-linecap")){this.setStrokeCap(ec.getStringAttribute("stroke-linecap"))}if(ec.hasAttribute("fill")){this.setFill(ec.getStringAttribute("fill"))}if(ec.hasAttribute("style")){var ef=ec.getStringAttribute("style");var ed=ef.toString().split(";");for(var eb=0,ea=ed.length;eb<ea;eb++){var ee=cW.trim(ed[eb].split(":"));if(ee[0]==="fill"){this.setFill(ee[1])}else{if(ee[0]==="fill-opacity"){this.setFillOpacity(ee[1])}else{if(ee[0]==="stroke"){this.setStroke(ee[1])}else{if(ee[0]==="stroke-width"){this.setStrokeWeight(ee[1])}else{if(ee[0]==="stroke-linecap"){this.setStrokeCap(ee[1])}else{if(ee[0]==="stroke-linejoin"){this.setStrokeJoin(ee[1])}else{if(ee[0]==="stroke-opacity"){this.setStrokeOpacity(ee[1])}else{if(ee[0]==="opacity"){this.setOpacity(ee[1])}}}}}}}}}}};cr.prototype.setFillOpacity=function(ea){this.fillOpacity=parseFloat(ea);this.fillColor=this.fillOpacity*255<<24|this.fillColor&16777215};cr.prototype.setFill=function(ea){var eb=this.fillColor&4278190080;if(ea==="none"){this.fill=false}else{if(ea.indexOf("#")===0){this.fill=true;if(ea.length===4){ea=ea.replace(/#(.)(.)(.)/,"#$1$1$2$2$3$3")}this.fillColor=eb|parseInt(ea.substring(1),16)&16777215}else{if(ea.indexOf("rgb")===0){this.fill=true;this.fillColor=eb|this.parseRGB(ea)}else{if(ea.indexOf("url(#")===0){this.fillName=ea.substring(5,ea.length-1)}else{if(E[ea]){this.fill=true;this.fillColor=eb|parseInt(E[ea].substring(1),16)&16777215}}}}}};cr.prototype.setOpacity=function(ea){this.strokeColor=parseFloat(ea)*255<<24|this.strokeColor&16777215;this.fillColor=parseFloat(ea)*255<<24|this.fillColor&16777215};cr.prototype.setStroke=function(ea){var eb=this.strokeColor&4278190080;if(ea==="none"){this.stroke=false}else{if(ea.charAt(0)==="#"){this.stroke=true;if(ea.length===4){ea=ea.replace(/#(.)(.)(.)/,"#$1$1$2$2$3$3")}this.strokeColor=eb|parseInt(ea.substring(1),16)&16777215}else{if(ea.indexOf("rgb")===0){this.stroke=true;this.strokeColor=eb|this.parseRGB(ea)}else{if(ea.indexOf("url(#")===0){this.strokeName=ea.substring(5,ea.length-1)}else{if(E[ea]){this.stroke=true;this.strokeColor=eb|parseInt(E[ea].substring(1),16)&16777215}}}}}};cr.prototype.setStrokeWeight=function(ea){this.strokeWeight=this.parseUnitSize(ea)};cr.prototype.setStrokeJoin=function(ea){if(ea==="miter"){this.strokeJoin="miter"}else{if(ea==="round"){this.strokeJoin="round"}else{if(ea==="bevel"){this.strokeJoin="bevel"}}}};cr.prototype.setStrokeCap=function(ea){if(ea==="butt"){this.strokeCap="butt"}else{if(ea==="round"){this.strokeCap="round"}else{if(ea==="square"){this.strokeCap="square"}}}};cr.prototype.setStrokeOpacity=function(ea){this.strokeOpacity=parseFloat(ea);this.strokeColor=this.strokeOpacity*255<<24|this.strokeColor&16777215};cr.prototype.parseRGB=function(eb){var ec=eb.substring(eb.indexOf("(")+1,eb.indexOf(")"));var ea=ec.split(", ");return ea[0]<<16|ea[1]<<8|ea[2]};cr.prototype.parseUnitSize=function(eb){var ea=eb.length-2;if(ea<0){return eb}if(eb.indexOf("pt")===ea){return parseFloat(eb.substring(0,ea))*1.25}if(eb.indexOf("pc")===ea){return parseFloat(eb.substring(0,ea))*15}if(eb.indexOf("mm")===ea){return parseFloat(eb.substring(0,ea))*3.543307}if(eb.indexOf("cm")===ea){return parseFloat(eb.substring(0,ea))*35.43307}if(eb.indexOf("in")===ea){return parseFloat(eb.substring(0,ea))*90}if(eb.indexOf("px")===ea){return parseFloat(eb.substring(0,ea))}return parseFloat(eb)};cW.shape=function(ec,eb,ee,ed,ea){if(arguments.length>=1&&arguments[0]!==null){if(ec.isVisible()){cW.pushMatrix();if(S===3){if(arguments.length===5){cW.translate(eb-ed/2,ee-ea/2);cW.scale(ed/ec.getWidth(),ea/ec.getHeight())}else{if(arguments.length===3){cW.translate(eb-ec.getWidth()/2,-ec.getHeight()/2)}else{cW.translate(-ec.getWidth()/2,-ec.getHeight()/2)}}}else{if(S===0){if(arguments.length===5){cW.translate(eb,ee);cW.scale(ed/ec.getWidth(),ea/ec.getHeight())}else{if(arguments.length===3){cW.translate(eb,ee)}}}else{if(S===1){if(arguments.length===5){ed-=eb;ea-=ee;cW.translate(eb,ee);cW.scale(ed/ec.getWidth(),ea/ec.getHeight())}else{if(arguments.length===3){cW.translate(eb,ee)}}}}}ec.draw(cW);if(arguments.length===1&&S===3||arguments.length>1){cW.popMatrix()}}}};cW.shapeMode=function(ea){S=ea};cW.loadShape=function(ea){if(arguments.length===1){if(ea.indexOf(".svg")>-1){return new cr(null,ea)}}return null};var cT=function(ee,ed,ea,eb,ec){this.fullName=ee||"";this.name=ed||"";this.namespace=ea||"";this.value=eb;this.type=ec};cT.prototype={getName:function(){return this.name},getFullName:function(){return this.fullName},getNamespace:function(){return this.namespace},getValue:function(){return this.value},getType:function(){return this.type},setValue:function(ea){this.value=ea}};var b9=cW.XMLElement=function(ea,ec,ed,eb){this.attributes=[];this.children=[];this.fullName=null;this.name=null;this.namespace="";this.content=null;this.parent=null;this.lineNr="";this.systemID="";this.type="ELEMENT";if(ea){if(typeof ea==="string"){if(ec===t&&ea.indexOf("<")>-1){this.parse(ea)}else{this.fullName=ea;this.namespace=ec;this.systemId=ed;this.lineNr=eb}}else{this.parse(ec)}}};b9.prototype={parse:function(ea){var ec;try{var ee=ea.substring(ea.length-4);if(ee===".xml"||ee===".svg"){ea=w(ea)}ec=(new DOMParser).parseFromString(ea,"text/xml");var eb=ec.documentElement;if(eb){this.parseChildrenRecursive(null,eb)}else{throw"Error loading document"}return this}catch(ed){throw ed}},parseChildrenRecursive:function(ei,eg){var ef,eb,eh,ee,ed,ea;if(!ei){this.fullName=eg.localName;this.name=eg.nodeName;ef=this}else{ef=new b9(eg.nodeName);ef.parent=ei}if(eg.nodeType===3&&eg.textContent!==""){return this.createPCDataElement(eg.textContent)}if(eg.nodeType===4){return this.createCDataElement(eg.textContent)}if(eg.attributes){for(ee=0,ed=eg.attributes.length;ee<ed;ee++){eh=eg.attributes[ee];eb=new cT(eh.getname,eh.nodeName,eh.namespaceURI,eh.nodeValue,eh.nodeType);ef.attributes.push(eb)}}if(eg.childNodes){for(ee=0,ed=eg.childNodes.length;ee<ed;ee++){var ec=eg.childNodes[ee];ea=ef.parseChildrenRecursive(ef,ec);if(ea!==null){ef.children.push(ea)}}}return ef},createElement:function(eb,ec,ed,ea){if(ed===t){return new b9(eb,ec)}return new b9(eb,ec,ed,ea)},createPCDataElement:function(eb,ea){if(eb.replace(/^\s+$/g,"")===""){return null}var ec=new b9;ec.type="TEXT";ec.content=eb;return ec},createCDataElement:function(ec){var ed=this.createPCDataElement(ec);if(ed===null){return null}ed.type="CDATA";var eb={"<":"&lt;",">":"&gt;","'":"&apos;",'"':"&quot;"},ea;for(ea in eb){if(!Object.hasOwnProperty(eb,ea)){ec=ec.replace(new RegExp(ea,"g"),eb[ea])}}ed.cdata=ec;return ed},hasAttribute:function(){if(arguments.length===1){return this.getAttribute(arguments[0])!==null}if(arguments.length===2){return this.getAttribute(arguments[0],arguments[1])!==null}},equals:function(ef){if(!(ef instanceof b9)){return false}var ec,eb;if(this.fullName!==ef.fullName){return false}if(this.attributes.length!==ef.getAttributeCount()){return false}if(this.attributes.length!==ef.attributes.length){return false}var ej,eh,ea,eg,ei;for(ec=0,eb=this.attributes.length;ec<eb;ec++){ej=this.attributes[ec].getName();eh=this.attributes[ec].getNamespace();ei=ef.findAttribute(ej,eh);if(ei===null){return false}if(this.attributes[ec].getValue()!==ei.getValue()){return false}if(this.attributes[ec].getType()!==ei.getType()){return false}}if(this.children.length!==ef.getChildCount()){return false}if(this.children.length>0){var ee,ed;for(ec=0,eb=this.children.length;ec<eb;ec++){ee=this.getChild(ec);ed=ef.getChild(ec);if(!ee.equals(ed)){return false}}return true}return this.content===ef.content},getContent:function(){if(this.type==="TEXT"||this.type==="CDATA"){return this.content}var ea=this.children;if(ea.length===1&&(ea[0].type==="TEXT"||ea[0].type==="CDATA")){return ea[0].content}return null},getAttribute:function(){var ea;if(arguments.length===2){ea=this.findAttribute(arguments[0]);if(ea){return ea.getValue()}return arguments[1]}else{if(arguments.length===1){ea=this.findAttribute(arguments[0]);if(ea){return ea.getValue()}return null}else{if(arguments.length===3){ea=this.findAttribute(arguments[0],arguments[1]);if(ea){return ea.getValue()}return arguments[2]}}}},getStringAttribute:function(){if(arguments.length===1){return this.getAttribute(arguments[0])}if(arguments.length===2){return this.getAttribute(arguments[0],arguments[1])}return this.getAttribute(arguments[0],arguments[1],arguments[2])},getString:function(ea){return this.getStringAttribute(ea)},getFloatAttribute:function(){if(arguments.length===1){return parseFloat(this.getAttribute(arguments[0],0))}if(arguments.length===2){return this.getAttribute(arguments[0],arguments[1])}return this.getAttribute(arguments[0],arguments[1],arguments[2])},getFloat:function(ea){return this.getFloatAttribute(ea)},getIntAttribute:function(){if(arguments.length===1){return this.getAttribute(arguments[0],0)}if(arguments.length===2){return this.getAttribute(arguments[0],arguments[1])}return this.getAttribute(arguments[0],arguments[1],arguments[2])},getInt:function(ea){return this.getIntAttribute(ea)},hasChildren:function(){return this.children.length>0},addChild:function(ea){if(ea!==null){ea.parent=this;this.children.push(ea)}},insertChild:function(ec,ea){if(ec){if(ec.getLocalName()===null&&!this.hasChildren()){var eb=this.children[this.children.length-1];if(eb.getLocalName()===null){eb.setContent(eb.getContent()+ec.getContent());return}}ec.parent=this;this.children.splice(ea,0,ec)}},getChild:function(eb){if(typeof eb==="number"){return this.children[eb]}if(eb.indexOf("/")!==-1){return this.getChildRecursive(eb.split("/"),0)}var ea,ee;for(var ed=0,ec=this.getChildCount();ed<ec;ed++){ea=this.getChild(ed);ee=ea.getName();if(ee!==null&&ee===eb){return ea}}return null},getChildren:function(){if(arguments.length===1){if(typeof arguments[0]==="number"){return this.getChild(arguments[0])}if(arguments[0].indexOf("/")!==-1){return this.getChildrenRecursive(arguments[0].split("/"),0)}var ee=[];var ea,ed;for(var ec=0,eb=this.getChildCount();ec<eb;ec++){ea=this.getChild(ec);ed=ea.getName();if(ed!==null&&ed===arguments[0]){ee.push(ea)}}return ee}return this.children},getChildCount:function(){return this.children.length},getChildRecursive:function(eb,eg){if(eg===eb.length){return this}var ea,ef,ee=eb[eg];for(var ed=0,ec=this.getChildCount();ed<ec;ed++){ea=this.getChild(ed);ef=ea.getName();if(ef!==null&&ef===ee){return ea.getChildRecursive(eb,eg+1)}}return null},getChildrenRecursive:function(ea,ee){if(ee===ea.length-1){return this.getChildren(ea[ee])}var ed=this.getChildren(ea[ee]);var ec=[];for(var eb=0;eb<ed.length;eb++){ec=ec.concat(ed[eb].getChildrenRecursive(ea,ee+1))}return ec},isLeaf:function(){return !this.hasChildren()},listChildren:function(){var ea=[];for(var ec=0,eb=this.children.length;ec<eb;ec++){ea.push(this.getChild(ec).getName())}return ea},removeAttribute:function(eb,ed){this.namespace=ed||"";for(var ec=0,ea=this.attributes.length;ec<ea;ec++){if(this.attributes[ec].getName()===eb&&this.attributes[ec].getNamespace()===this.namespace){this.attributes.splice(ec,1);break}}},removeChild:function(ec){if(ec){for(var eb=0,ea=this.children.length;eb<ea;eb++){if(this.children[eb].equals(ec)){this.children.splice(eb,1);break}}}},removeChildAtIndex:function(ea){if(this.children.length>ea){this.children.splice(ea,1)}},findAttribute:function(eb,ed){this.namespace=ed||"";for(var ec=0,ea=this.attributes.length;ec<ea;ec++){if(this.attributes[ec].getName()===eb&&this.attributes[ec].getNamespace()===this.namespace){return this.attributes[ec]}}return null},setAttribute:function(){var ea;if(arguments.length===3){var ec=arguments[0].indexOf(":");var eb=arguments[0].substring(ec+1);ea=this.findAttribute(eb,arguments[1]);if(ea){ea.setValue(arguments[2])}else{ea=new cT(arguments[0],eb,arguments[1],arguments[2],"CDATA");this.attributes.push(ea)}}else{ea=this.findAttribute(arguments[0]);if(ea){ea.setValue(arguments[1])}else{ea=new cT(arguments[0],arguments[0],null,arguments[1],"CDATA");this.attributes.push(ea)}}},setString:function(ea,eb){this.setAttribute(ea,eb)},setInt:function(ea,eb){this.setAttribute(ea,eb)},setFloat:function(ea,eb){this.setAttribute(ea,eb)},setContent:function(ea){if(this.children.length>0){F.debug("Tried to set content for XMLElement with children")}this.content=ea},setName:function(){if(arguments.length===1){this.name=arguments[0];this.fullName=arguments[0];this.namespace=null}else{var ea=arguments[0].indexOf(":");if(arguments[1]===null||ea<0){this.name=arguments[0]}else{this.name=arguments[0].substring(ea+1)}this.fullName=arguments[0];this.namespace=arguments[1]}},getName:function(){return this.fullName},getLocalName:function(){return this.name},getAttributeCount:function(){return this.attributes.length},toString:function(){if(this.type==="TEXT"){return this.content}if(this.type==="CDATA"){return this.cdata}var ec=this.fullName;var ed="<"+ec;var eb,ee;for(eb=0;eb<this.attributes.length;eb++){var ea=this.attributes[eb];ed+=" "+ea.getName()+'="'+ea.getValue()+'"'}if(this.children.length===0){if(this.content===""){ed+="/>"}else{ed+=">"+this.content+"</"+ec+">"}}else{ed+=">";for(ee=0;ee<this.children.length;ee++){ed+=this.children[ee].toString()}ed+="</"+ec+">"}return ed}};b9.parse=function(eb){var ea=new b9;ea.parse(eb);return ea};var dg=cW.XML=cW.XMLElement;cW.loadXML=function(ea){return new dg(cW,ea)};var cm=function(ed){var ea=0;for(var eb=0;eb<ed.length;eb++){if(eb!==0){ea=q.max(ea,q.abs(ed[eb]))}else{ea=q.abs(ed[eb])}}var ec=(ea+"").indexOf(".");if(ec===0){ec=1}else{if(ec===-1){ec=(ea+"").length}}return ec};var aX=cW.PMatrix2D=function(){if(arguments.length===0){this.reset()}else{if(arguments.length===1&&arguments[0] instanceof aX){this.set(arguments[0].array())}else{if(arguments.length===6){this.set(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5])}}}};aX.prototype={set:function(){if(arguments.length===6){var ea=arguments;this.set([ea[0],ea[1],ea[2],ea[3],ea[4],ea[5]])}else{if(arguments.length===1&&arguments[0] instanceof aX){this.elements=arguments[0].array()}else{if(arguments.length===1&&arguments[0] instanceof Array){this.elements=arguments[0].slice()}}}},get:function(){var ea=new aX;ea.set(this.elements);return ea},reset:function(){this.set([1,0,0,0,1,0])},array:function aE(){return this.elements.slice()},translate:function(eb,ea){this.elements[2]=eb*this.elements[0]+ea*this.elements[1]+this.elements[2];this.elements[5]=eb*this.elements[3]+ea*this.elements[4]+this.elements[5]},invTranslate:function(eb,ea){this.translate(-eb,-ea)},transpose:function(){},mult:function(eb,ec){var ea,ed;if(eb instanceof A){ea=eb.x;ed=eb.y;if(!ec){ec=new A}}else{if(eb instanceof Array){ea=eb[0];ed=eb[1];if(!ec){ec=[]}}}if(ec instanceof Array){ec[0]=this.elements[0]*ea+this.elements[1]*ed+this.elements[2];ec[1]=this.elements[3]*ea+this.elements[4]*ed+this.elements[5]}else{if(ec instanceof A){ec.x=this.elements[0]*ea+this.elements[1]*ed+this.elements[2];ec.y=this.elements[3]*ea+this.elements[4]*ed+this.elements[5];ec.z=0}}return ec},multX:function(ea,eb){return ea*this.elements[0]+eb*this.elements[1]+this.elements[2]},multY:function(ea,eb){return ea*this.elements[3]+eb*this.elements[4]+this.elements[5]},skewX:function(ea){this.apply(1,0,1,ea,0,0)},skewY:function(ea){this.apply(1,0,1,0,ea,0)},shearX:function(ea){this.apply(1,0,1,q.tan(ea),0,0)},shearY:function(ea){this.apply(1,0,1,0,q.tan(ea),0)},determinant:function(){return this.elements[0]*this.elements[4]-this.elements[1]*this.elements[3]},invert:function(){var ef=this.determinant();if(q.abs(ef)>-2147483648){var eb=this.elements[0];var eg=this.elements[1];var ee=this.elements[2];var ed=this.elements[3];var ec=this.elements[4];var ea=this.elements[5];this.elements[0]=ec/ef;this.elements[3]=-ed/ef;this.elements[1]=-eg/ef;this.elements[4]=eb/ef;this.elements[2]=(eg*ea-ec*ee)/ef;this.elements[5]=(ed*ee-eb*ea)/ef;return true}return false},scale:function(eb,ea){if(eb&&!ea){ea=eb}if(eb&&ea){this.elements[0]*=eb;this.elements[1]*=ea;this.elements[3]*=eb;this.elements[4]*=ea}},invScale:function(eb,ea){if(eb&&!ea){ea=eb}this.scale(1/eb,1/ea)},apply:function(){var ec;if(arguments.length===1&&arguments[0] instanceof aX){ec=arguments[0].array()}else{if(arguments.length===6){ec=Array.prototype.slice.call(arguments)}else{if(arguments.length===1&&arguments[0] instanceof Array){ec=arguments[0]}}}var ea=[0,0,this.elements[2],0,0,this.elements[5]];var ed=0;for(var ee=0;ee<2;ee++){for(var eb=0;eb<3;eb++,ed++){ea[ed]+=this.elements[ee*3+0]*ec[eb+0]+this.elements[ee*3+1]*ec[eb+3]}}this.elements=ea.slice()},preApply:function(){var eb;if(arguments.length===1&&arguments[0] instanceof aX){eb=arguments[0].array()}else{if(arguments.length===6){eb=Array.prototype.slice.call(arguments)}else{if(arguments.length===1&&arguments[0] instanceof Array){eb=arguments[0]}}}var ea=[0,0,eb[2],0,0,eb[5]];ea[2]=eb[2]+this.elements[2]*eb[0]+this.elements[5]*eb[1];ea[5]=eb[5]+this.elements[2]*eb[3]+this.elements[5]*eb[4];ea[0]=this.elements[0]*eb[0]+this.elements[3]*eb[1];ea[3]=this.elements[0]*eb[3]+this.elements[3]*eb[4];ea[1]=this.elements[1]*eb[0]+this.elements[4]*eb[1];ea[4]=this.elements[1]*eb[3]+this.elements[4]*eb[4];this.elements=ea.slice()},rotate:function(ec){var ee=q.cos(ec);var ea=q.sin(ec);var ed=this.elements[0];var eb=this.elements[1];this.elements[0]=ee*ed+ea*eb;this.elements[1]=-ea*ed+ee*eb;ed=this.elements[3];eb=this.elements[4];this.elements[3]=ee*ed+ea*eb;this.elements[4]=-ea*ed+ee*eb},rotateZ:function(ea){this.rotate(ea)},invRotateZ:function(ea){this.rotateZ(ea-q.PI)},print:function(){var eb=cm(this.elements);var ea=""+cW.nfs(this.elements[0],eb,4)+" "+cW.nfs(this.elements[1],eb,4)+" "+cW.nfs(this.elements[2],eb,4)+"\n"+cW.nfs(this.elements[3],eb,4)+" "+cW.nfs(this.elements[4],eb,4)+" "+cW.nfs(this.elements[5],eb,4)+"\n\n";cW.println(ea)}};var aP=cW.PMatrix3D=function(){this.reset()};aP.prototype={set:function(){if(arguments.length===16){this.elements=Array.prototype.slice.call(arguments)}else{if(arguments.length===1&&arguments[0] instanceof aP){this.elements=arguments[0].array()}else{if(arguments.length===1&&arguments[0] instanceof Array){this.elements=arguments[0].slice()}}}},get:function(){var ea=new aP;ea.set(this.elements);return ea},reset:function(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},array:function aE(){return this.elements.slice()},translate:function(eb,ea,ec){if(ec===t){ec=0}this.elements[3]+=eb*this.elements[0]+ea*this.elements[1]+ec*this.elements[2];this.elements[7]+=eb*this.elements[4]+ea*this.elements[5]+ec*this.elements[6];this.elements[11]+=eb*this.elements[8]+ea*this.elements[9]+ec*this.elements[10];this.elements[15]+=eb*this.elements[12]+ea*this.elements[13]+ec*this.elements[14]},transpose:function(){var ea=this.elements[4];this.elements[4]=this.elements[1];this.elements[1]=ea;ea=this.elements[8];this.elements[8]=this.elements[2];this.elements[2]=ea;ea=this.elements[6];this.elements[6]=this.elements[9];this.elements[9]=ea;ea=this.elements[3];this.elements[3]=this.elements[12];this.elements[12]=ea;ea=this.elements[7];this.elements[7]=this.elements[13];this.elements[13]=ea;ea=this.elements[11];this.elements[11]=this.elements[14];this.elements[14]=ea},mult:function(ec,ed){var ea,ef,ee,eb;if(ec instanceof A){ea=ec.x;ef=ec.y;ee=ec.z;eb=1;if(!ed){ed=new A}}else{if(ec instanceof Array){ea=ec[0];ef=ec[1];ee=ec[2];eb=ec[3]||1;if(!ed||ed.length!==3&&ed.length!==4){ed=[0,0,0]}}}if(ed instanceof Array){if(ed.length===3){ed[0]=this.elements[0]*ea+this.elements[1]*ef+this.elements[2]*ee+this.elements[3];ed[1]=this.elements[4]*ea+this.elements[5]*ef+this.elements[6]*ee+this.elements[7];ed[2]=this.elements[8]*ea+this.elements[9]*ef+this.elements[10]*ee+this.elements[11]}else{if(ed.length===4){ed[0]=this.elements[0]*ea+this.elements[1]*ef+this.elements[2]*ee+this.elements[3]*eb;ed[1]=this.elements[4]*ea+this.elements[5]*ef+this.elements[6]*ee+this.elements[7]*eb;ed[2]=this.elements[8]*ea+this.elements[9]*ef+this.elements[10]*ee+this.elements[11]*eb;ed[3]=this.elements[12]*ea+this.elements[13]*ef+this.elements[14]*ee+this.elements[15]*eb}}}if(ed instanceof A){ed.x=this.elements[0]*ea+this.elements[1]*ef+this.elements[2]*ee+this.elements[3];ed.y=this.elements[4]*ea+this.elements[5]*ef+this.elements[6]*ee+this.elements[7];ed.z=this.elements[8]*ea+this.elements[9]*ef+this.elements[10]*ee+this.elements[11]}return ed},preApply:function(){var ec;if(arguments.length===1&&arguments[0] instanceof aP){ec=arguments[0].array()}else{if(arguments.length===16){ec=Array.prototype.slice.call(arguments)}else{if(arguments.length===1&&arguments[0] instanceof Array){ec=arguments[0]}}}var ea=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];var ed=0;for(var ee=0;ee<4;ee++){for(var eb=0;eb<4;eb++,ed++){ea[ed]+=this.elements[eb+0]*ec[ee*4+0]+this.elements[eb+4]*ec[ee*4+1]+this.elements[eb+8]*ec[ee*4+2]+this.elements[eb+12]*ec[ee*4+3]}}this.elements=ea.slice()},apply:function(){var ec;if(arguments.length===1&&arguments[0] instanceof aP){ec=arguments[0].array()}else{if(arguments.length===16){ec=Array.prototype.slice.call(arguments)}else{if(arguments.length===1&&arguments[0] instanceof Array){ec=arguments[0]}}}var ea=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];var ed=0;for(var ee=0;ee<4;ee++){for(var eb=0;eb<4;eb++,ed++){ea[ed]+=this.elements[ee*4+0]*ec[eb+0]+this.elements[ee*4+1]*ec[eb+4]+this.elements[ee*4+2]*ec[eb+8]+this.elements[ee*4+3]*ec[eb+12]}}this.elements=ea.slice()},rotate:function(ee,ea,eg,ed){if(!eg){this.rotateZ(ee)}else{var ef=cW.cos(ee);var ec=cW.sin(ee);var eb=1-ef;this.apply(eb*ea*ea+ef,eb*ea*eg-ec*ed,eb*ea*ed+ec*eg,0,eb*ea*eg+ec*ed,eb*eg*eg+ef,eb*eg*ed-ec*ea,0,eb*ea*ed-ec*eg,eb*eg*ed+ec*ea,eb*ed*ed+ef,0,0,0,0,1)}},invApply:function(){if(ab===t){ab=new aP}var ea=arguments;ab.set(ea[0],ea[1],ea[2],ea[3],ea[4],ea[5],ea[6],ea[7],ea[8],ea[9],ea[10],ea[11],ea[12],ea[13],ea[14],ea[15]);if(!ab.invert()){return false}this.preApply(ab);return true},rotateX:function(eb){var ec=cW.cos(eb);var ea=cW.sin(eb);this.apply([1,0,0,0,0,ec,-ea,0,0,ea,ec,0,0,0,0,1])},rotateY:function(eb){var ec=cW.cos(eb);var ea=cW.sin(eb);this.apply([ec,0,ea,0,0,1,0,0,-ea,0,ec,0,0,0,0,1])},rotateZ:function(eb){var ec=q.cos(eb);var ea=q.sin(eb);this.apply([ec,-ea,0,0,ea,ec,0,0,0,0,1,0,0,0,0,1])},scale:function(ec,eb,ea){if(ec&&!eb&&!ea){eb=ea=ec}else{if(ec&&eb&&!ea){ea=1}}if(ec&&eb&&ea){this.elements[0]*=ec;this.elements[1]*=eb;this.elements[2]*=ea;this.elements[4]*=ec;this.elements[5]*=eb;this.elements[6]*=ea;this.elements[8]*=ec;this.elements[9]*=eb;this.elements[10]*=ea;this.elements[12]*=ec;this.elements[13]*=eb;this.elements[14]*=ea}},skewX:function(eb){var ea=q.tan(eb);this.apply(1,ea,0,0,0,1,0,0,0,0,1,0,0,0,0,1)},skewY:function(eb){var ea=q.tan(eb);this.apply(1,0,0,0,ea,1,0,0,0,0,1,0,0,0,0,1)},shearX:function(eb){var ea=q.tan(eb);this.apply(1,ea,0,0,0,1,0,0,0,0,1,0,0,0,0,1)},shearY:function(eb){var ea=q.tan(eb);this.apply(1,0,0,0,ea,1,0,0,0,0,1,0,0,0,0,1)},multX:function(ea,ed,ec,eb){if(!ec){return this.elements[0]*ea+this.elements[1]*ed+this.elements[3]}if(!eb){return this.elements[0]*ea+this.elements[1]*ed+this.elements[2]*ec+this.elements[3]}return this.elements[0]*ea+this.elements[1]*ed+this.elements[2]*ec+this.elements[3]*eb},multY:function(ea,ed,ec,eb){if(!ec){return this.elements[4]*ea+this.elements[5]*ed+this.elements[7]}if(!eb){return this.elements[4]*ea+this.elements[5]*ed+this.elements[6]*ec+this.elements[7]}return this.elements[4]*ea+this.elements[5]*ed+this.elements[6]*ec+this.elements[7]*eb},multZ:function(ea,ed,ec,eb){if(!eb){return this.elements[8]*ea+this.elements[9]*ed+this.elements[10]*ec+this.elements[11]}return this.elements[8]*ea+this.elements[9]*ed+this.elements[10]*ec+this.elements[11]*eb},multW:function(ea,ed,ec,eb){if(!eb){return this.elements[12]*ea+this.elements[13]*ed+this.elements[14]*ec+this.elements[15]}return this.elements[12]*ea+this.elements[13]*ed+this.elements[14]*ec+this.elements[15]*eb},invert:function(){var ej=this.elements[0]*this.elements[5]-this.elements[1]*this.elements[4];var ei=this.elements[0]*this.elements[6]-this.elements[2]*this.elements[4];var eh=this.elements[0]*this.elements[7]-this.elements[3]*this.elements[4];var eg=this.elements[1]*this.elements[6]-this.elements[2]*this.elements[5];var ef=this.elements[1]*this.elements[7]-this.elements[3]*this.elements[5];var ee=this.elements[2]*this.elements[7]-this.elements[3]*this.elements[6];var ed=this.elements[8]*this.elements[13]-this.elements[9]*this.elements[12];var ec=this.elements[8]*this.elements[14]-this.elements[10]*this.elements[12];var eb=this.elements[8]*this.elements[15]-this.elements[11]*this.elements[12];var eo=this.elements[9]*this.elements[14]-this.elements[10]*this.elements[13];var em=this.elements[9]*this.elements[15]-this.elements[11]*this.elements[13];var el=this.elements[10]*this.elements[15]-this.elements[11]*this.elements[14];var en=ej*el-ei*em+eh*eo+eg*eb-ef*ec+ee*ed;if(q.abs(en)<=1e-9){return false}var ek=[];ek[0]=+this.elements[5]*el-this.elements[6]*em+this.elements[7]*eo;ek[4]=-this.elements[4]*el+this.elements[6]*eb-this.elements[7]*ec;ek[8]=+this.elements[4]*em-this.elements[5]*eb+this.elements[7]*ed;ek[12]=-this.elements[4]*eo+this.elements[5]*ec-this.elements[6]*ed;ek[1]=-this.elements[1]*el+this.elements[2]*em-this.elements[3]*eo;ek[5]=+this.elements[0]*el-this.elements[2]*eb+this.elements[3]*ec;ek[9]=-this.elements[0]*em+this.elements[1]*eb-this.elements[3]*ed;ek[13]=+this.elements[0]*eo-this.elements[1]*ec+this.elements[2]*ed;ek[2]=+this.elements[13]*ee-this.elements[14]*ef+this.elements[15]*eg;ek[6]=-this.elements[12]*ee+this.elements[14]*eh-this.elements[15]*ei;ek[10]=+this.elements[12]*ef-this.elements[13]*eh+this.elements[15]*ej;ek[14]=-this.elements[12]*eg+this.elements[13]*ei-this.elements[14]*ej;ek[3]=-this.elements[9]*ee+this.elements[10]*ef-this.elements[11]*eg;ek[7]=+this.elements[8]*ee-this.elements[10]*eh+this.elements[11]*ei;ek[11]=-this.elements[8]*ef+this.elements[9]*eh-this.elements[11]*ej;ek[15]=+this.elements[8]*eg-this.elements[9]*ei+this.elements[10]*ej;var ea=1/en;ek[0]*=ea;ek[1]*=ea;ek[2]*=ea;ek[3]*=ea;ek[4]*=ea;ek[5]*=ea;ek[6]*=ea;ek[7]*=ea;ek[8]*=ea;ek[9]*=ea;ek[10]*=ea;ek[11]*=ea;ek[12]*=ea;ek[13]*=ea;ek[14]*=ea;ek[15]*=ea;this.elements=ek.slice();return true},toString:function(){var eb="";for(var ea=0;ea<15;ea++){eb+=this.elements[ea]+", "}eb+=this.elements[15];return eb},print:function(){var eb=cm(this.elements);var ea=""+cW.nfs(this.elements[0],eb,4)+" "+cW.nfs(this.elements[1],eb,4)+" "+cW.nfs(this.elements[2],eb,4)+" "+cW.nfs(this.elements[3],eb,4)+"\n"+cW.nfs(this.elements[4],eb,4)+" "+cW.nfs(this.elements[5],eb,4)+" "+cW.nfs(this.elements[6],eb,4)+" "+cW.nfs(this.elements[7],eb,4)+"\n"+cW.nfs(this.elements[8],eb,4)+" "+cW.nfs(this.elements[9],eb,4)+" "+cW.nfs(this.elements[10],eb,4)+" "+cW.nfs(this.elements[11],eb,4)+"\n"+cW.nfs(this.elements[12],eb,4)+" "+cW.nfs(this.elements[13],eb,4)+" "+cW.nfs(this.elements[14],eb,4)+" "+cW.nfs(this.elements[15],eb,4)+"\n\n";cW.println(ea)},invTranslate:function(eb,ea,ec){this.preApply(1,0,0,-eb,0,1,0,-ea,0,0,1,-ec,0,0,0,1)},invRotateX:function(eb){var ec=q.cos(-eb);var ea=q.sin(-eb);this.preApply([1,0,0,0,0,ec,-ea,0,0,ea,ec,0,0,0,0,1])},invRotateY:function(eb){var ec=q.cos(-eb);var ea=q.sin(-eb);this.preApply([ec,0,ea,0,0,1,0,0,-ea,0,ec,0,0,0,0,1])},invRotateZ:function(eb){var ec=q.cos(-eb);var ea=q.sin(-eb);this.preApply([ec,-ea,0,0,ea,ec,0,0,0,0,1,0,0,0,0,1])},invScale:function(ea,ec,eb){this.preApply([1/ea,0,0,0,0,1/ec,0,0,0,0,1/eb,0,0,0,0,1])}};var V=cW.PMatrixStack=function(){this.matrixStack=[]};V.prototype.load=function(){var ea=dY.$newPMatrix();if(arguments.length===1){ea.set(arguments[0])}else{ea.set(arguments)}this.matrixStack.push(ea)};bR.prototype.$newPMatrix=function(){return new aX};bB.prototype.$newPMatrix=function(){return new aP};V.prototype.push=function(){this.matrixStack.push(this.peek())};V.prototype.pop=function(){return this.matrixStack.pop()};V.prototype.peek=function(){var ea=dY.$newPMatrix();ea.set(this.matrixStack[this.matrixStack.length-1]);return ea};V.prototype.mult=function(ea){this.matrixStack[this.matrixStack.length-1].apply(ea)};cW.split=function(eb,ea){return eb.split(ea)};cW.splitTokens=function(eg,ef){if(ef===t){return eg.split(/\s+/g)}var ed=ef.split(/()/g),eb="",ea=eg.length,ec,eh,ee=[];for(ec=0;ec<ea;ec++){eh=eg[ec];if(ed.indexOf(eh)>-1){if(eb!==""){ee.push(eb)}eb=""}else{eb+=eh}}if(eb!==""){ee.push(eb)}return ee};cW.append=function(eb,ea){eb[eb.length]=ea;return eb};cW.concat=function(eb,ea){return eb.concat(ea)};cW.sort=function(ef,ed){var eb=[];if(ef.length>0){var ee=ed>0?ed:ef.length;for(var ec=0;ec<ee;ec++){eb.push(ef[ec])}if(typeof ef[0]==="string"){eb.sort()}else{eb.sort(function(eh,eg){return eh-eg})}if(ed>0){for(var ea=eb.length;ea<ef.length;ea++){eb.push(ef[ea])}}}return eb};cW.splice=function(ee,ed,eb){if(ed.length===0){return ee}if(ed instanceof Array){for(var ec=0,ea=eb;ec<ed.length;ea++,ec++){ee.splice(ea,0,ed[ec])}}else{ee.splice(eb,0,ed)}return ee};cW.subset=function(ed,ec,eb){var ea=eb!==t?ec+eb:ed.length;return ed.slice(ec,ea)};cW.join=function(eb,ea){return eb.join(ea)};cW.shorten=function(ed){var eb=[];var ea=ed.length;for(var ec=0;ec<ea;ec++){eb[ec]=ed[ec]}eb.pop();return eb};cW.expand=function(ec,ed){var eb=ec.slice(0),ea=ed||ec.length*2;eb.length=ea;return eb};cW.arrayCopy=function(){var eg,ee=0,ec,eb=0,ef;if(arguments.length===2){eg=arguments[0];ec=arguments[1];ef=eg.length}else{if(arguments.length===3){eg=arguments[0];ec=arguments[1];ef=arguments[2]}else{if(arguments.length===5){eg=arguments[0];ee=arguments[1];ec=arguments[2];eb=arguments[3];ef=arguments[4]}}}for(var ed=ee,ea=eb;ed<ef+ee;ed++,ea++){if(ec[ea]!==t){ec[ea]=eg[ed]}else{throw"array index out of bounds exception"}}};cW.reverse=function(ea){return ea.reverse()};cW.mix=function(eb,ea,ec){return eb+((ea-eb)*ec>>8)};cW.peg=function(ea){return ea<0?0:ea>255?255:ea};cW.modes=function(){var ef=4278190080,ec=16711680,eb=65280,ee=255,ed=q.min,ea=q.max;function eg(el,eo,ek,et,ev,eu,em,eq,ep,ei,ej){var es=ed(((el&4278190080)>>>24)+eo,255)<<24;var eh=ek+((ep-ek)*eo>>8);eh=(eh<0?0:eh>255?255:eh)<<16;var en=et+((ei-et)*eo>>8);en=(en<0?0:en>255?255:en)<<8;var er=ev+((ej-ev)*eo>>8);er=er<0?0:er>255?255:er;return es|eh|en|er}return{replace:function(ei,eh){return eh},blend:function(ej,ei){var el=(ei&ef)>>>24,eh=ej&ec,en=ej&eb,ep=ej&ee,eo=ei&ec,ek=ei&eb,em=ei&ee;return ed(((ej&ef)>>>24)+el,255)<<24|eh+((eo-eh)*el>>8)&ec|en+((ek-en)*el>>8)&eb|ep+((em-ep)*el>>8)&ee},add:function(ei,eh){var ej=(eh&ef)>>>24;return ed(((ei&ef)>>>24)+ej,255)<<24|ed((ei&ec)+((eh&ec)>>8)*ej,ec)&ec|ed((ei&eb)+((eh&eb)>>8)*ej,eb)&eb|ed((ei&ee)+((eh&ee)*ej>>8),ee)},subtract:function(ei,eh){var ej=(eh&ef)>>>24;return ed(((ei&ef)>>>24)+ej,255)<<24|ea((ei&ec)-((eh&ec)>>8)*ej,eb)&ec|ea((ei&eb)-((eh&eb)>>8)*ej,ee)&eb|ea((ei&ee)-((eh&ee)*ej>>8),0)},lightest:function(ei,eh){var ej=(eh&ef)>>>24;return ed(((ei&ef)>>>24)+ej,255)<<24|ea(ei&ec,((eh&ec)>>8)*ej)&ec|ea(ei&eb,((eh&eb)>>8)*ej)&eb|ea(ei&ee,(eh&ee)*ej>>8)},darkest:function(ej,ei){var el=(ei&ef)>>>24,eh=ej&ec,en=ej&eb,ep=ej&ee,eo=ed(ej&ec,((ei&ec)>>8)*el),ek=ed(ej&eb,((ei&eb)>>8)*el),em=ed(ej&ee,(ei&ee)*el>>8);return ed(((ej&ef)>>>24)+el,255)<<24|eh+((eo-eh)*el>>8)&ec|en+((ek-en)*el>>8)&eb|ep+((em-ep)*el>>8)&ee},difference:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=ej>er?ej-er:er-ej,eh=eq>em?eq-em:em-eq,ei=es>ep?es-ep:ep-es;return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},exclusion:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=ej+er-(ej*er>>7),eh=eq+em-(eq*em>>7),ei=es+ep-(es*ep>>7);return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},multiply:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=ej*er>>8,eh=eq*em>>8,ei=es*ep>>8;return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},screen:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=255-((255-ej)*(255-er)>>8),eh=255-((255-eq)*(255-em)>>8),ei=255-((255-es)*(255-ep)>>8);return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},hard_light:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=er<128?ej*er>>7:255-((255-ej)*(255-er)>>7),eh=em<128?eq*em>>7:255-((255-eq)*(255-em)>>7),ei=ep<128?es*ep>>7:255-((255-es)*(255-ep)>>7);return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},soft_light:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=(ej*er>>7)+(ej*ej>>8)-(ej*ej*er>>15),eh=(eq*em>>7)+(eq*eq>>8)-(eq*eq*em>>15),ei=(es*ep>>7)+(es*es>>8)-(es*es*ep>>15);return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},overlay:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee,eo=ej<128?ej*er>>7:255-((255-ej)*(255-er)>>7),eh=eq<128?eq*em>>7:255-((255-eq)*(255-em)>>7),ei=es<128?es*ep>>7:255-((255-es)*(255-ep)>>7);return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},dodge:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee;var eo=255;if(er!==255){eo=(ej<<8)/(255-er);eo=eo<0?0:eo>255?255:eo}var eh=255;if(em!==255){eh=(eq<<8)/(255-em);eh=eh<0?0:eh>255?255:eh}var ei=255;if(ep!==255){ei=(es<<8)/(255-ep);ei=ei<0?0:ei>255?255:ei}return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)},burn:function(el,ek){var en=(ek&ef)>>>24,ej=(el&ec)>>16,eq=(el&eb)>>8,es=el&ee,er=(ek&ec)>>16,em=(ek&eb)>>8,ep=ek&ee;var eo=0;if(er!==0){eo=(255-ej<<8)/er;eo=255-(eo<0?0:eo>255?255:eo)}var eh=0;if(em!==0){eh=(255-eq<<8)/em;eh=255-(eh<0?0:eh>255?255:eh)}var ei=0;if(ep!==0){ei=(255-es<<8)/ep;ei=255-(ei<0?0:ei>255?255:ei)}return eg(el,en,ej,eq,es,er,em,ep,eo,eh,ei)}}}();function dH(ef,ee,ec,eb){var ea,ed,eh,ei;if(cY===3){var eg=cW.color.toRGB(ef,ee,ec);ea=eg[0];ed=eg[1];eh=eg[2]}else{ea=q.round(255*(ef/bJ));ed=q.round(255*(ee/bI));eh=q.round(255*(ec/bG))}ei=q.round(255*(eb/bU));ea=ea<0?0:ea;ed=ed<0?0:ed;eh=eh<0?0:eh;ei=ei<0?0:ei;ea=ea>255?255:ea;ed=ed>255?255:ed;eh=eh>255?255:eh;ei=ei>255?255:ei;return ei<<24&4278190080|ea<<16&16711680|ed<<8&65280|eh&255}function dK(ea,ec){var eb;if(ea&4278190080){eb=q.round(255*(ec/bU));eb=eb>255?255:eb;eb=eb<0?0:eb;return ea-(ea&4278190080)+(eb<<24&4278190080)}if(cY===1){return dH(ea,ea,ea,ec)}if(cY===3){return dH(0,0,ea/bJ*bG,ec)}}function dM(ea){if(ea<=bJ&&ea>=0){if(cY===1){return dH(ea,ea,ea,bU)}if(cY===3){return dH(0,0,ea/bJ*bG,bU)}}if(ea){if(ea>2147483647){ea-=4294967296}return ea}}cW.color=function(ea,ed,ec,eb){if(ea!==t&&ed!==t&&ec!==t&&eb!==t){return dH(ea,ed,ec,eb)}if(ea!==t&&ed!==t&&ec!==t){return dH(ea,ed,ec,bU)}if(ea!==t&&ed!==t){return dK(ea,ed)}if(typeof ea==="number"){return dM(ea)}return dH(bJ,bI,bG,bU)};cW.color.toString=function(ea){return"rgba("+((ea>>16)&255)+","+((ea>>8)&255)+","+(ea&255)+","+((ea>>24)&255)/255+")"};cW.color.toInt=function(ed,ec,ea,eb){return eb<<24&4278190080|ed<<16&16711680|ec<<8&65280|ea&255};cW.color.toArray=function(ea){return[(ea>>16)&255,(ea>>8)&255,ea&255,(ea>>24)&255]};cW.color.toGLArray=function(ea){return[((ea&16711680)>>>16)/255,((ea>>8)&255)/255,(ea&255)/255,((ea>>24)&255)/255]};cW.color.toRGB=function(ec,ei,ef){ec=ec>bJ?bJ:ec;ei=ei>bI?bI:ei;ef=ef>bG?bG:ef;ec=ec/bJ*360;ei=ei/bI*100;ef=ef/bG*100;var eh=q.round(ef/100*255);if(ei===0){return[eh,eh,eh]}var ed=ec%360;var ee=ed%60;var eb=q.round(ef*(100-ei)/10000*255);var ea=q.round(ef*(6000-ei*ee)/600000*255);var eg=q.round(ef*(6000-ei*(60-ee))/600000*255);switch(q.floor(ed/60)){case 0:return[eh,eg,eb];case 1:return[ea,eh,eb];case 2:return[eb,eh,eg];case 3:return[eb,ea,eh];case 4:return[eg,eb,eh];case 5:return[eh,eb,ea]}};function aS(eh){var eg,ef,eb;eg=((eh>>16)&255)/255;ef=((eh>>8)&255)/255;eb=(eh&255)/255;var ea=cW.max(cW.max(eg,ef),eb),ed=cW.min(cW.min(eg,ef),eb),ec,ee;if(ed===ea){return[0,0,ea*bG]}ee=(ea-ed)/ea;if(eg===ea){ec=(ef-eb)/(ea-ed)}else{if(ef===ea){ec=2+(eb-eg)/(ea-ed)}else{ec=4+(eg-ef)/(ea-ed)}}ec/=6;if(ec<0){ec+=1}else{if(ec>1){ec-=1}}return[ec*bJ,ee*bI,ea*bG]}cW.brightness=function(ea){return aS(ea)[2]};cW.saturation=function(ea){return aS(ea)[1]};cW.hue=function(ea){return aS(ea)[0]};cW.red=function(ea){return((ea>>16)&255)/255*bJ};cW.green=function(ea){return((ea&65280)>>>8)/255*bI};cW.blue=function(ea){return(ea&255)/255*bG};cW.alpha=function(ea){return((ea>>24)&255)/255*bU};cW.lerpColor=function(em,el,ef){var ek,eq,er,es,eo,ea,eg,eu,en,ev,ee,et;var ei,eh,eb,ep,ej;var ed=cW.color(em);var ec=cW.color(el);if(cY===3){ei=aS(ed);eu=((ed>>24)&255)/bU;eh=aS(ec);et=((ec&4278190080)>>>24)/bU;ep=cW.lerp(ei[0],eh[0],ef);ej=cW.lerp(ei[1],eh[1],ef);er=cW.lerp(ei[2],eh[2],ef);eb=cW.color.toRGB(ep,ej,er);es=cW.lerp(eu,et,ef)*bU;return es<<24&4278190080|(eb[0]&255)<<16|(eb[1]&255)<<8|eb[2]&255}eo=(ed>>16)&255;ea=(ed>>8)&255;eg=ed&255;eu=((ed>>24)&255)/bU;en=(ec&16711680)>>>16;ev=(ec>>8)&255;ee=ec&255;et=((ec>>24)&255)/bU;ek=cW.lerp(eo,en,ef)|0;eq=cW.lerp(ea,ev,ef)|0;er=cW.lerp(eg,ee,ef)|0;es=cW.lerp(eu,et,ef)*bU;return es<<24&4278190080|ek<<16&16711680|eq<<8&65280|er&255};cW.colorMode=function(){cY=arguments[0];if(arguments.length>1){bJ=arguments[1];bI=arguments[2]||arguments[1];bG=arguments[3]||arguments[1];bU=arguments[4]||arguments[1]}};cW.blendColor=function(eb,ea,ec){if(ec===0){return cW.modes.replace(eb,ea)}else{if(ec===1){return cW.modes.blend(eb,ea)}else{if(ec===2){return cW.modes.add(eb,ea)}else{if(ec===4){return cW.modes.subtract(eb,ea)}else{if(ec===8){return cW.modes.lightest(eb,ea)}else{if(ec===16){return cW.modes.darkest(eb,ea)}else{if(ec===32){return cW.modes.difference(eb,ea)}else{if(ec===64){return cW.modes.exclusion(eb,ea)}else{if(ec===128){return cW.modes.multiply(eb,ea)}else{if(ec===256){return cW.modes.screen(eb,ea)}else{if(ec===1024){return cW.modes.hard_light(eb,ea)}else{if(ec===2048){return cW.modes.soft_light(eb,ea)}else{if(ec===512){return cW.modes.overlay(eb,ea)}else{if(ec===4096){return cW.modes.dodge(eb,ea)}else{if(ec===8192){return cW.modes.burn(eb,ea)}}}}}}}}}}}}}}}};function aD(){d8.save()}function cP(){d8.restore();b3=true;aq=true}cW.printMatrix=function(){dJ.print()};bR.prototype.translate=function(ea,eb){dJ.translate(ea,eb);aT.invTranslate(ea,eb);d8.translate(ea,eb)};bB.prototype.translate=function(ea,ec,eb){dJ.translate(ea,ec,eb);aT.invTranslate(ea,ec,eb)};bR.prototype.scale=function(ea,eb){dJ.scale(ea,eb);aT.invScale(ea,eb);d8.scale(ea,eb||ea)};bB.prototype.scale=function(ea,ec,eb){dJ.scale(ea,ec,eb);aT.invScale(ea,ec,eb)};bR.prototype.transform=function(eb){var ea=eb.array();d8.transform(ea[0],ea[3],ea[1],ea[4],ea[2],ea[5])};bB.prototype.transformm=function(ea){throw"p.transform is currently not supported in 3D mode"};bR.prototype.pushMatrix=function(){am.load(dJ);da.load(aT);aD()};bB.prototype.pushMatrix=function(){am.load(dJ);da.load(aT)};bR.prototype.popMatrix=function(){dJ.set(am.pop());aT.set(da.pop());cP()};bB.prototype.popMatrix=function(){dJ.set(am.pop());aT.set(da.pop())};bR.prototype.resetMatrix=function(){dJ.reset();aT.reset();d8.setTransform(1,0,0,1,0,0)};bB.prototype.resetMatrix=function(){dJ.reset();aT.reset()};ds.prototype.applyMatrix=function(){var ea=arguments;dJ.apply(ea[0],ea[1],ea[2],ea[3],ea[4],ea[5],ea[6],ea[7],ea[8],ea[9],ea[10],ea[11],ea[12],ea[13],ea[14],ea[15]);aT.invApply(ea[0],ea[1],ea[2],ea[3],ea[4],ea[5],ea[6],ea[7],ea[8],ea[9],ea[10],ea[11],ea[12],ea[13],ea[14],ea[15])};bR.prototype.applyMatrix=function(){var ea=arguments;for(var eb=ea.length;eb<16;eb++){ea[eb]=0}ea[10]=ea[15]=1;ds.prototype.applyMatrix.apply(this,ea)};cW.rotateX=function(ea){dJ.rotateX(ea);aT.invRotateX(ea)};bR.prototype.rotateZ=function(){throw"rotateZ() is not supported in 2D mode. Use rotate(float) instead."};bB.prototype.rotateZ=function(ea){dJ.rotateZ(ea);aT.invRotateZ(ea)};cW.rotateY=function(ea){dJ.rotateY(ea);aT.invRotateY(ea)};bR.prototype.rotate=function(ea){dJ.rotateZ(ea);aT.invRotateZ(ea);d8.rotate(ea)};bB.prototype.rotate=function(ea){cW.rotateZ(ea)};bR.prototype.shearX=function(ea){dJ.shearX(ea);d8.transform(1,0,ea,1,0,0)};bB.prototype.shearX=function(ea){dJ.shearX(ea)};bR.prototype.shearY=function(ea){dJ.shearY(ea);d8.transform(1,ea,0,1,0,0)};bB.prototype.shearY=function(ea){dJ.shearY(ea)};cW.pushStyle=function(){aD();cW.pushMatrix();var ea={doFill:aH,currentFillColor:a1,doStroke:ce,currentStrokeColor:cv,curTint:bf,curRectMode:bK,curColorMode:cY,colorModeX:bJ,colorModeZ:bG,colorModeY:bI,colorModeA:bU,curTextFont:W,horizontalTextAlignment:N,verticalTextAlignment:c1,textMode:cI,curFontName:Y,curTextSize:d0,curTextAscent:a3,curTextDescent:dA,curTextLeading:d7};bm.push(ea)};cW.popStyle=function(){var ea=bm.pop();if(ea){cP();cW.popMatrix();aH=ea.doFill;a1=ea.currentFillColor;ce=ea.doStroke;cv=ea.currentStrokeColor;bf=ea.curTint;bK=ea.curRectMode;cY=ea.curColorMode;bJ=ea.colorModeX;bG=ea.colorModeZ;bI=ea.colorModeY;bU=ea.colorModeA;W=ea.curTextFont;Y=ea.curFontName;d0=ea.curTextSize;N=ea.horizontalTextAlignment;c1=ea.verticalTextAlignment;cI=ea.textMode;a3=ea.curTextAscent;dA=ea.curTextDescent;d7=ea.curTextLeading}else{throw"Too many popStyle() without enough pushStyle()"}};cW.year=function(){return(new Date).getFullYear()};cW.month=function(){return(new Date).getMonth()+1};cW.day=function(){return(new Date).getDate()};cW.hour=function(){return(new Date).getHours()};cW.minute=function(){return(new Date).getMinutes()};cW.second=function(){return(new Date).getSeconds()};cW.millis=function(){return Date.now()-dq};function ct(){var ea=(Date.now()-dt)/1000;P++;var eb=P/ea;if(ea>0.5){dt=Date.now();P=0;cW.__frameRate=eb}cW.frameCount++}bR.prototype.redraw=function(){ct();d8.lineWidth=dW;var ea=cW.pmouseX,eb=cW.pmouseY;cW.pmouseX=dN;cW.pmouseY=d5;aD();cW.draw();cP();dN=cW.mouseX;d5=cW.mouseY;cW.pmouseX=ea;cW.pmouseY=eb};bB.prototype.redraw=function(){ct();var ea=cW.pmouseX,eb=cW.pmouseY;cW.pmouseX=dN;cW.pmouseY=d5;d8.clear(d8.DEPTH_BUFFER_BIT);dC={attributes:{},locations:{}};cW.noLights();cW.lightFalloff(1,0,0);cW.shininess(1);cW.ambient(255,255,255);cW.specular(0,0,0);cW.emissive(0,0,0);cW.camera();cW.draw();dN=cW.mouseX;d5=cW.mouseY;cW.pmouseX=ea;cW.pmouseY=eb};cW.noLoop=function(){aC=false;ax=false;clearInterval(b4);cQ.onPause()};cW.loop=function(){if(ax){return}dt=Date.now();P=0;b4=D.setInterval(function(){try{cQ.onFrameStart();cW.redraw();cQ.onFrameEnd()}catch(ea){D.clearInterval(b4);throw ea}},az);aC=true;ax=true;cQ.onLoop()};cW.frameRate=function(ea){dU=ea;az=1000/dU;if(aC){cW.noLoop();cW.loop()}};var au=[];function bO(ec,eb,ea){if(ec.addEventListener){ec.addEventListener(eb,ea,false)}else{ec.attachEvent("on"+eb,ea)}au.push({elem:ec,type:eb,fn:ea})}function de(ea){var ed=ea.elem,ec=ea.type,eb=ea.fn;if(ed.removeEventListener){ed.removeEventListener(ec,eb,false)}else{if(ed.detachEvent){ed.detachEvent("on"+ec,eb)}}}cW.exit=function(){D.clearInterval(b4);L(cW.externals.canvas.id);delete ae.onmousedown;for(var eb in F.lib){if(F.lib.hasOwnProperty(eb)){if(F.lib[eb].hasOwnProperty("detach")){F.lib[eb].detach(cW)}}}var ea=au.length;while(ea--){de(au[ea])}cQ.onExit()};cW.cursor=function(){if(arguments.length>1||arguments.length===1&&arguments[0] instanceof cW.PImage){var ed=arguments[0],ea,ef;if(arguments.length>=3){ea=arguments[1];ef=arguments[2];if(ea<0||ef<0||ef>=ed.height||ea>=ed.width){throw"x and y must be non-negative and less than the dimensions of the image"}}else{ea=ed.width>>>1;ef=ed.height>>>1}var eb=ed.toDataURL();var ec='url("'+eb+'") '+ea+" "+ef+", default";Z=ae.style.cursor=ec}else{if(arguments.length===1){var ee=arguments[0];Z=ae.style.cursor=ee}else{Z=ae.style.cursor=ck}}};cW.noCursor=function(){Z=ae.style.cursor=B.NOCURSOR};cW.link=function(ea,eb){if(eb!==t){D.open(ea,eb)}else{D.location=ea}};cW.beginDraw=G;cW.endDraw=G;bR.prototype.toImageData=function(ea,ed,eb,ec){ea=ea!==t?ea:0;ed=ed!==t?ed:0;eb=eb!==t?eb:cW.width;ec=ec!==t?ec:cW.height;return d8.getImageData(ea,ed,eb,ec)};bB.prototype.toImageData=function(ei,eh,ej,ee){ei=ei!==t?ei:0;eh=eh!==t?eh:0;ej=ej!==t?ej:cW.width;ee=ee!==t?ee:cW.height;var eg=d.createElement("canvas"),ek=eg.getContext("2d"),ed=ek.createImageData(ej,ee),eb=new b(ej*ee*4);d8.readPixels(ei,eh,ej,ee,d8.RGBA,d8.UNSIGNED_BYTE,eb);for(var ec=0,ef=eb.length,ea=ed.data;ec<ef;ec++){ea[ec]=eb[(ee-1-q.floor(ec/4/ej))*ej*4+ec%(ej*4)]}return ed};cW.status=function(ea){D.status=ea};cW.binary=function(eb,ec){var ed;if(ec>0){ed=ec}else{if(eb instanceof bP){ed=16;eb|=0}else{ed=32;while(ed>1&&!(eb>>>ed-1&1)){ed--}}}var ea="";while(ed>0){ea+=eb>>>--ed&1?"1":"0"}return ea};cW.unbinary=function(eb){var ed=eb.length-1,ec=1,ea=0;while(ed>=0){var ee=eb[ed--];if(ee!=="0"&&ee!=="1"){throw"the value passed into unbinary was not an 8 bit binary number"}if(ee==="1"){ea+=ec}ec<<=1}return ea};function cX(em,ek,ee,ep,eg,en){var ec=em<0?ee:ek;var eb=eg===0;var el=eg===t||eg<0?0:eg;var ej=q.abs(em);if(eb){el=1;ej*=10;while(q.abs(q.round(ej)-ej)>0.000001&&el<7){++el;ej*=10}}else{if(el!==0){ej*=q.pow(10,el)}}var ed,ei=ej*2;if(q.floor(ej)===ej){ed=ej}else{if(q.floor(ei)===ei){var ea=q.floor(ej);ed=ea+ea%2}else{ed=q.round(ej)}}var ef="";var eo=ep+el;while(eo>0||ed>0){eo--;ef=""+ed%10+ef;ed=q.floor(ed/10)}if(en!==t){var eh=ef.length-3-el;while(eh>0){ef=ef.substring(0,eh)+en+ef.substring(eh);eh-=3}}if(el>0){return ec+ef.substring(0,ef.length-el)+"."+ef.substring(ef.length-el,ef.length)}return ec+ef}function ao(eg,ef,ea,ei,eb,eh){if(eg instanceof Array){var ed=[];for(var ec=0,ee=eg.length;ec<ee;ec++){ed.push(cX(eg[ec],ef,ea,ei,eb,eh))}return ed}return cX(eg,ef,ea,ei,eb,eh)}cW.nf=function(ec,ea,eb){return ao(ec,"","-",ea,eb)};cW.nfs=function(ec,ea,eb){return ao(ec," ","-",ea,eb)};cW.nfp=function(ec,ea,eb){return ao(ec,"+","-",ea,eb)};cW.nfc=function(ec,ea,eb){return ao(ec,"","-",ea,eb,",")};var aM=function(ec,eb){eb=eb===t||eb===null?eb=8:eb;if(ec<0){ec=4294967295+ec+1}var ea=Number(ec).toString(16).toUpperCase();while(ea.length<eb){ea="0"+ea}if(ea.length>=eb){ea=ea.substring(ea.length-eb,ea.length)}return ea};cW.hex=function(eb,ea){if(arguments.length===1){if(eb instanceof bP){ea=4}else{ea=8}}return aM(eb,ea)};function dF(ea){var eb=parseInt("0x"+ea,16);if(eb>2147483647){eb-=4294967296}return eb}cW.unhex=function(ec){if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(dF(ec[eb]))}return ea}return dF(ec)};cW.loadStrings=function(eb){if(localStorage[eb]){return localStorage[eb].split("\n")}var ea=w(eb);if(typeof ea!=="string"||ea===""){return[]}ea=ea.replace(/(\r\n?)/g,"\n").replace(/\n$/,"");return ea.split("\n")};cW.saveStrings=function(eb,ea){localStorage[eb]=ea.join("\n")};cW.loadBytes=function(ec){var eb=w(ec);var ea=[];for(var ed=0;ed<eb.length;ed++){ea.push(eb.charCodeAt(ed))}return ea};function bc(ea){return Array.prototype.slice.call(ea,1)}cW.matchAll=function(eb,ea){var ed=[],ec;var ee=new RegExp(ea,"g");while((ec=ee.exec(eb))!==null){ed.push(ec);if(ec[0].length===0){++ee.lastIndex}}return ed.length>0?ed:null};cW.__contains=function(eb,ea){if(typeof eb!=="string"){return eb.contains.apply(eb,bc(arguments))}return eb!==null&&ea!==null&&typeof ea==="string"&&eb.indexOf(ea)>-1};cW.__replaceAll=function(ea,ec,eb){if(typeof ea!=="string"){return ea.replaceAll.apply(ea,bc(arguments))}return ea.replace(new RegExp(ec,"g"),eb)};cW.__replaceFirst=function(ea,ec,eb){if(typeof ea!=="string"){return ea.replaceFirst.apply(ea,bc(arguments))}return ea.replace(new RegExp(ec,""),eb)};cW.__replace=function(ed,ef,ee){if(typeof ed!=="string"){return ed.replace.apply(ed,bc(arguments))}if(ef instanceof RegExp){return ed.replace(ef,ee)}if(typeof ef!=="string"){ef=ef.toString()}if(ef===""){return ed}var ec=ed.indexOf(ef);if(ec<0){return ed}var eb=0,ea="";do{ea+=ed.substring(eb,ec)+ee;eb=ec+ef.length}while((ec=ed.indexOf(ef,eb))>=0);return ea+ed.substring(eb)};cW.__equals=function(eb,ea){if(eb.equals instanceof Function){return eb.equals.apply(eb,bc(arguments))}return eb.valueOf()===ea.valueOf()};cW.__equalsIgnoreCase=function(eb,ea){if(typeof eb!=="string"){return eb.equalsIgnoreCase.apply(eb,bc(arguments))}return eb.toLowerCase()===ea.toLowerCase()};cW.__toCharArray=function(ec){if(typeof ec!=="string"){return ec.toCharArray.apply(ec,bc(arguments))}var ed=[];for(var eb=0,ea=ec.length;eb<ea;++eb){ed[eb]=new bP(ec.charAt(eb))}return ed};cW.__split=function(ed,ee,eb){if(typeof ed!=="string"){return ed.split.apply(ed,bc(arguments))}var eg=new RegExp(ee);if(eb===t||eb<1){return ed.split(eg)}var ea=[],ef=ed,eh;while((eh=ef.search(eg))!==-1&&ea.length<eb-1){var ec=eg.exec(ef).toString();ea.push(ef.substring(0,eh));ef=ef.substring(eh+ec.length)}if(eh!==-1||ef!==""){ea.push(ef)}return ea};cW.__codePointAt=function(ed,eb){var ee=ed.charCodeAt(eb),ec,ea;if(55296<=ee&&ee<=56319){ec=ee;ea=ed.charCodeAt(eb+1);return(ec-55296)*1024+(ea-56320)+65536}return ee};cW.match=function(eb,ea){return eb.match(ea)};cW.__matches=function(eb,ea){return(new RegExp(ea)).test(eb)};cW.__startsWith=function(ea,ec,eb){if(typeof ea!=="string"){return ea.startsWith.apply(ea,bc(arguments))}eb=eb||0;if(eb<0||eb>ea.length){return false}return ec===""||ec===ea?true:ea.indexOf(ec)===eb};cW.__endsWith=function(eb,ec){if(typeof eb!=="string"){return eb.endsWith.apply(eb,bc(arguments))}var ea=ec?ec.length:0;return ec===""||ec===eb?true:eb.indexOf(ec)===eb.length-ea};cW.__hashCode=function(ea){if(ea.hashCode instanceof Function){return ea.hashCode.apply(ea,bc(arguments))}return h(ea)};cW.__printStackTrace=function(ea){cW.println("Exception: "+ea.toString())};var d9=[];cW.println=function(ea){var eb=d9.length;if(eb){F.logger.log(d9.join(""));d9.length=0}if(arguments.length===0&&eb===0){F.logger.log("")}else{if(arguments.length!==0){F.logger.log(ea)}}};cW.print=function(ea){d9.push(ea)};cW.str=function(ec){if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(ec[eb].toString()+"")}return ea}return ec.toString()+""};cW.trim=function(ec){if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(ec[eb].replace(/^\s*/,"").replace(/\s*$/,"").replace(/\r*$/,""))}return ea}return ec.replace(/^\s*/,"").replace(/\s*$/,"").replace(/\r*$/,"")};function aR(ea){if(typeof ea==="number"){return ea!==0}if(typeof ea==="boolean"){return ea}if(typeof ea==="string"){return ea.toLowerCase()==="true"}if(ea instanceof bP){return ea.code===49||ea.code===84||ea.code===116}}cW.parseBoolean=function(ec){if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(aR(ec[eb]))}return ea}return aR(ec)};cW.parseByte=function(ec){if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(0-(ec[eb]&128)|ec[eb]&127)}return ea}return 0-(ec&128)|ec&127};cW.parseChar=function(ec){if(typeof ec==="number"){return new bP(String.fromCharCode(ec&65535))}if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(new bP(String.fromCharCode(ec[eb]&65535)))}return ea}throw"char() may receive only one argument of type int, byte, int[], or byte[]."};function cO(ea){if(typeof ea==="number"){return ea}if(typeof ea==="boolean"){return ea?1:0}if(typeof ea==="string"){return parseFloat(ea)}if(ea instanceof bP){return ea.code}}cW.parseFloat=function(ec){if(ec instanceof Array){var ea=[];for(var eb=0;eb<ec.length;eb++){ea.push(cO(ec[eb]))}return ea}return cO(ec)};function al(ec,ea){if(typeof ec==="number"){return ec&4294967295}if(typeof ec==="boolean"){return ec?1:0}if(typeof ec==="string"){var eb=parseInt(ec,ea||10);return eb&4294967295}if(ec instanceof bP){return ec.code}}cW.parseInt=function(ed,ec){if(ed instanceof Array){var ea=[];for(var eb=0;eb<ed.length;eb++){if(typeof ed[eb]==="string"&&!/^\s*[+\-]?\d+\s*$/.test(ed[eb])){ea.push(0)}else{ea.push(al(ed[eb],ec))}}return ea}return al(ed,ec)};cW.__int_cast=function(ea){return 0|ea};cW.__instanceof=function(ec,eb){if(typeof eb!=="function"){throw"Function is expected as type argument for instanceof operator"}if(typeof ec==="string"){return eb===Object||eb===String}if(ec instanceof eb){return true}if(typeof ec!=="object"||ec===null){return false}var ee=ec.constructor;if(eb.$isInterface){var ed=[];while(ee){if(ee.$interfaces){ed=ed.concat(ee.$interfaces)}ee=ee.$base}while(ed.length>0){var ea=ed.shift();if(ea===eb){return true}if(ea.$interfaces){ed=ed.concat(ea.$interfaces)}}return false}while(ee.hasOwnProperty("$base")){ee=ee.$base;if(ee===eb){return true}}return false};cW.abs=q.abs;cW.ceil=q.ceil;cW.constrain=function(eb,ec,ea){return eb>ea?ea:eb<ec?ec:eb};cW.dist=function(){var ec,eb,ea;if(arguments.length===4){ec=arguments[0]-arguments[2];eb=arguments[1]-arguments[3];return q.sqrt(ec*ec+eb*eb)}if(arguments.length===6){ec=arguments[0]-arguments[3];eb=arguments[1]-arguments[4];ea=arguments[2]-arguments[5];return q.sqrt(ec*ec+eb*eb+ea*ea)}};cW.exp=q.exp;cW.floor=q.floor;cW.lerp=function(eb,ea,ec){return(ea-eb)*ec+eb};cW.log=q.log;cW.mag=function(eb,ea,ec){if(ec){return q.sqrt(eb*eb+ea*ea+ec*ec)}return q.sqrt(eb*eb+ea*ea)};cW.map=function(ed,eb,ec,ea,ee){return ea+(ee-ea)*((ed-eb)/(ec-eb))};cW.max=function(){if(arguments.length===2){return arguments[0]<arguments[1]?arguments[1]:arguments[0]}var eb=arguments.length===1?arguments[0]:arguments;if(!("length" in eb&&eb.length>0)){throw"Non-empty array is expected"}var ea=eb[0],ed=eb.length;for(var ec=1;ec<ed;++ec){if(ea<eb[ec]){ea=eb[ec]}}return ea};cW.min=function(){if(arguments.length===2){return arguments[0]<arguments[1]?arguments[0]:arguments[1]}var ea=arguments.length===1?arguments[0]:arguments;if(!("length" in ea&&ea.length>0)){throw"Non-empty array is expected"}var ec=ea[0],ed=ea.length;for(var eb=1;eb<ed;++eb){if(ec>ea[eb]){ec=ea[eb]}}return ec};cW.norm=function(eb,ea,ec){return(eb-ea)/(ec-ea)};cW.pow=q.pow;cW.round=q.round;cW.sq=function(ea){return ea*ea};cW.sqrt=q.sqrt;cW.acos=q.acos;cW.asin=q.asin;cW.atan=q.atan;cW.atan2=q.atan2;cW.cos=q.cos;cW.degrees=function(ea){return ea*180/q.PI};cW.radians=function(ea){return ea/180*q.PI};cW.sin=q.sin;cW.tan=q.tan;var bY=q.random;cW.random=function(){if(arguments.length===0){return bY()}if(arguments.length===1){return bY()*arguments[0]}var eb=arguments[0],ea=arguments[1];return bY()*(ea-eb)+eb};function co(ec,eb){var ee=ec||362436069,ea=eb||521288629;var ed=function(){ee=36969*(ee&65535)+(ee>>>16)&4294967295;ea=18000*(ea&65535)+(ea>>>16)&4294967295;return((ee&65535)<<16|ea&65535)&4294967295};this.nextDouble=function(){var ef=ed()/4294967296;return ef<0?1+ef:ef};this.nextInt=ed}co.createRandomized=function(){var ea=new Date;return new co(ea/60000&4294967295,ea&4294967295)};cW.randomSeed=function(ea){bY=(new co(ea)).nextDouble};cW.Random=function(ea){var ed=false,eb,ec;this.nextGaussian=function(){if(ed){ed=false;return eb}var eh,ef,ee;do{eh=2*ec()-1;ef=2*ec()-1;ee=eh*eh+ef*ef}while(ee>=1||ee===0);var eg=q.sqrt(-2*q.log(ee)/ee);eb=ef*eg;ed=true;return eh*eg};ec=ea===t?q.random:(new co(ea)).nextDouble};function dz(eh){var eb=eh!==t?new co(eh):co.createRandomized();var eg,ee;var ed=new b(512);for(eg=0;eg<256;++eg){ed[eg]=eg}for(eg=0;eg<256;++eg){var ej=ed[ee=eb.nextInt()&255];ed[ee]=ed[eg];ed[eg]=ej}for(eg=0;eg<256;++eg){ed[eg+256]=ed[eg]}function ea(en,ek,eq,ep){var eo=en&15;var em=eo<8?ek:eq,el=eo<4?eq:eo===12||eo===14?ek:ep;return((eo&1)===0?em:-em)+((eo&2)===0?el:-el)}function ef(em,ek,en){var el=(em&1)===0?ek:en;return(em&2)===0?-el:el}function ei(el,ek){return(el&1)===0?-ek:ek}function ec(em,el,ek){return el+em*(ek-el)}this.noise3d=function(ew,ev,eu){var en=q.floor(ew)&255,el=q.floor(ev)&255,ek=q.floor(eu)&255;ew-=q.floor(ew);ev-=q.floor(ev);eu-=q.floor(eu);var er=(3-2*ew)*ew*ew,eq=(3-2*ev)*ev*ev,ep=(3-2*eu)*eu*eu;var ey=ed[en]+el,et=ed[ey]+ek,es=ed[ey+1]+ek,ex=ed[en+1]+el,eo=ed[ex]+ek,em=ed[ex+1]+ek;return ec(ep,ec(eq,ec(er,ea(ed[et],ew,ev,eu),ea(ed[eo],ew-1,ev,eu)),ec(er,ea(ed[es],ew,ev-1,eu),ea(ed[em],ew-1,ev-1,eu))),ec(eq,ec(er,ea(ed[et+1],ew,ev,eu-1),ea(ed[eo+1],ew-1,ev,eu-1)),ec(er,ea(ed[es+1],ew,ev-1,eu-1),ea(ed[em+1],ew-1,ev-1,eu-1))))};this.noise2d=function(ek,er){var eq=q.floor(ek)&255,eo=q.floor(er)&255;ek-=q.floor(ek);er-=q.floor(er);var em=(3-2*ek)*ek*ek,el=(3-2*er)*er*er;var ep=ed[eq]+eo,en=ed[eq+1]+eo;return ec(el,ec(em,ef(ed[ep],ek,er),ef(ed[en],ek-1,er)),ec(em,ef(ed[ep+1],ek,er-1),ef(ed[en+1],ek-1,er-1)))};this.noise1d=function(ek){var em=q.floor(ek)&255;ek-=q.floor(ek);var el=(3-2*ek)*ek*ek;return ec(el,ei(ed[em],ek),ei(ed[em+1],ek-1))}}var bW={generator:t,octaves:4,fallout:0.5,seed:t};cW.noise=function(ea,eh,eg){if(bW.generator===t){bW.generator=new dz(bW.seed)}var ef=bW.generator;var ee=1,eb=1,ed=0;for(var ec=0;ec<bW.octaves;++ec){ee*=bW.fallout;switch(arguments.length){case 1:ed+=ee*(1+ef.noise1d(eb*ea))/2;break;case 2:ed+=ee*(1+ef.noise2d(eb*ea,eb*eh))/2;break;case 3:ed+=ee*(1+ef.noise3d(eb*ea,eb*eh,eb*eg))/2;break}eb*=2}return ed};cW.noiseDetail=function(eb,ea){bW.octaves=eb;if(ea!==t){bW.fallout=ea}};cW.noiseSeed=function(ea){bW.seed=ea;bW.generator=t};ds.prototype.size=function(eb,ee,ed){if(ce){cW.stroke(0)}if(aH){cW.fill(255)}var ec={fillStyle:d8.fillStyle,strokeStyle:d8.strokeStyle,lineCap:d8.lineCap,lineJoin:d8.lineJoin};if(ae.style.length>0){ae.style.removeProperty("width");ae.style.removeProperty("height")}ae.width=cW.width=eb||100;ae.height=cW.height=ee||100;for(var ef in ec){if(ec.hasOwnProperty(ef)){d8[ef]=ec[ef]}}cW.textFont(W);cW.background();bZ=q.max(1000,eb*ee*0.05);cW.externals.context=d8;for(var ea=0;ea<720;ea++){ah[ea]=cW.sin(ea*(q.PI/180)*0.5);bl[ea]=cW.cos(ea*(q.PI/180)*0.5)}};bR.prototype.size=function(ea,ec,eb){if(d8===t){d8=ae.getContext("2d");am=new V;da=new V;dJ=new aX;aT=new aX}ds.prototype.size.apply(this,arguments)};bB.prototype.size=function(){var eb=false;return function ea(ed,ef,ee){if(eb){throw"Multiple calls to size() for 3D renders are not allowed."}eb=true;function eg(ei){var el=["experimental-webgl","webgl","webkit-3d"],ek;for(var ej=0,eh=el.length;ej<eh;ej++){ek=ei.getContext(el[ej],{antialias:false,preserveDrawingBuffer:true});if(ek){break}}return ek}try{ae.width=cW.width=ed||100;ae.height=cW.height=ef||100;d8=eg(ae);c7=d8.createTexture();bS=d8.createTexture()}catch(ec){F.debug(ec)}if(!d8){throw"WebGL context is not supported on this browser."}d8.viewport(0,0,ae.width,ae.height);d8.enable(d8.DEPTH_TEST);d8.enable(d8.BLEND);d8.blendFunc(d8.SRC_ALPHA,d8.ONE_MINUS_SRC_ALPHA);dQ=bF(d8,dE,aW);bT=bF(d8,aO,bQ);cW.strokeWeight(1);dx=bF(d8,dn,aF);d8.useProgram(dx);dZ("usingTexture3d",dx,"usingTexture",dT);cW.lightFalloff(1,0,0);cW.shininess(1);cW.ambient(255,255,255);cW.specular(0,0,0);cW.emissive(0,0,0);bh=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,bh);d8.bufferData(d8.ARRAY_BUFFER,dh,d8.STATIC_DRAW);cJ=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,cJ);d8.bufferData(d8.ARRAY_BUFFER,df,d8.STATIC_DRAW);dk=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,dk);d8.bufferData(d8.ARRAY_BUFFER,bH,d8.STATIC_DRAW);aB=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,aB);d8.bufferData(d8.ARRAY_BUFFER,ak,d8.STATIC_DRAW);b2=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,b2);d8.bufferData(d8.ARRAY_BUFFER,ai,d8.STATIC_DRAW);bg=d8.createBuffer();b8=d8.createBuffer();at=d8.createBuffer();aG=d8.createBuffer();bC=d8.createBuffer();af=d8.createBuffer();aw=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,aw);d8.bufferData(d8.ARRAY_BUFFER,new e([0,0,0]),d8.STATIC_DRAW);cH=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,cH);d8.bufferData(d8.ARRAY_BUFFER,new e([1,1,0,-1,1,0,-1,-1,0,1,-1,0]),d8.STATIC_DRAW);ac=d8.createBuffer();d8.bindBuffer(d8.ARRAY_BUFFER,ac);d8.bufferData(d8.ARRAY_BUFFER,new e([0,0,1,0,1,1,0,1]),d8.STATIC_DRAW);R=d8.createBuffer();d8.bindBuffer(d8.ELEMENT_ARRAY_BUFFER,R);d8.bufferData(d8.ELEMENT_ARRAY_BUFFER,new y([0,1,2,2,3,0]),d8.STATIC_DRAW);bV=new aP;ch=new aP;dJ=new aP;aT=new aP;db=new aP;cW.camera();cW.perspective();am=new V;da=new V;c3=new aP;aQ=new aP;aL=new aP;bz=new aP;cd=new aP;U=new aP;U.set(-1,3,-3,1,3,-6,3,0,-3,3,0,0,1,0,0,0);ds.prototype.size.apply(this,arguments)}}();bR.prototype.ambientLight=ds.prototype.a3DOnlyFunction;bB.prototype.ambientLight=function(ea,ed,ei,ej,ef,ee){if(dL===8){throw"can only create "+8+" lights"}var eg=new A(ej,ef,ee);var eh=new aP;eh.scale(1,-1,1);eh.apply(dJ.array());eh.mult(eg,eg);var eb=dH(ea,ed,ei,0);var ec=[((eb>>16)&255)/255,((eb>>8)&255)/255,(eb&255)/255];d8.useProgram(dx);d2("uLights.color.3d."+dL,dx,"uLights"+dL+".color",ec);d2("uLights.position.3d."+dL,dx,"uLights"+dL+".position",eg.array());dZ("uLights.type.3d."+dL,dx,"uLights"+dL+".type",0);dZ("uLightCount3d",dx,"uLightCount",++dL)};bR.prototype.directionalLight=ds.prototype.a3DOnlyFunction;bB.prototype.directionalLight=function(ea,eg,ei,eh,ef,ee){if(dL===8){throw"can only create "+8+" lights"}d8.useProgram(dx);var ej=new aP;ej.scale(1,-1,1);ej.apply(dJ.array());ej=ej.array();var ec=[ej[0]*eh+ej[4]*ef+ej[8]*ee,ej[1]*eh+ej[5]*ef+ej[9]*ee,ej[2]*eh+ej[6]*ef+ej[10]*ee];var eb=dH(ea,eg,ei,0);var ed=[((eb>>16)&255)/255,((eb>>8)&255)/255,(eb&255)/255];d2("uLights.color.3d."+dL,dx,"uLights"+dL+".color",ed);d2("uLights.position.3d."+dL,dx,"uLights"+dL+".position",ec);dZ("uLights.type.3d."+dL,dx,"uLights"+dL+".type",1);dZ("uLightCount3d",dx,"uLightCount",++dL)};bR.prototype.lightFalloff=ds.prototype.a3DOnlyFunction;bB.prototype.lightFalloff=function(eb,ea,ec){d8.useProgram(dx);d2("uFalloff3d",dx,"uFalloff",[eb,ea,ec])};bR.prototype.lightSpecular=ds.prototype.a3DOnlyFunction;bB.prototype.lightSpecular=function(ee,ed,ea){var eb=dH(ee,ed,ea,0);var ec=[((eb>>16)&255)/255,((eb>>8)&255)/255,(eb&255)/255];d8.useProgram(dx);d2("uSpecular3d",dx,"uSpecular",ec)};cW.lights=function(){cW.ambientLight(128,128,128);cW.directionalLight(128,128,128,0,0,-1);cW.lightFalloff(1,0,0);cW.lightSpecular(0,0,0)};bR.prototype.pointLight=ds.prototype.a3DOnlyFunction;bB.prototype.pointLight=function(ea,ed,ei,ej,ef,ee){if(dL===8){throw"can only create "+8+" lights"}var eg=new A(ej,ef,ee);var eh=new aP;eh.scale(1,-1,1);eh.apply(dJ.array());eh.mult(eg,eg);var eb=dH(ea,ed,ei,0);var ec=[((eb>>16)&255)/255,((eb>>8)&255)/255,(eb&255)/255];d8.useProgram(dx);d2("uLights.color.3d."+dL,dx,"uLights"+dL+".color",ec);d2("uLights.position.3d."+dL,dx,"uLights"+dL+".position",eg.array());dZ("uLights.type.3d."+dL,dx,"uLights"+dL+".type",2);dZ("uLightCount3d",dx,"uLightCount",++dL)};bR.prototype.noLights=ds.prototype.a3DOnlyFunction;bB.prototype.noLights=function(){dL=0;d8.useProgram(dx);dZ("uLightCount3d",dx,"uLightCount",dL)};bR.prototype.spotLight=ds.prototype.a3DOnlyFunction;bB.prototype.spotLight=function(ea,ei,en,eo,em,ek,ej,eh,ef,ee,eg){if(dL===8){throw"can only create "+8+" lights"}d8.useProgram(dx);var el=new A(eo,em,ek);var ep=new aP;ep.scale(1,-1,1);ep.apply(dJ.array());ep.mult(el,el);ep=ep.array();var ec=[ep[0]*ej+ep[4]*eh+ep[8]*ef,ep[1]*ej+ep[5]*eh+ep[9]*ef,ep[2]*ej+ep[6]*eh+ep[10]*ef];var eb=dH(ea,ei,en,0);var ed=[((eb>>16)&255)/255,((eb>>8)&255)/255,(eb&255)/255];d2("uLights.color.3d."+dL,dx,"uLights"+dL+".color",ed);d2("uLights.position.3d."+dL,dx,"uLights"+dL+".position",el.array());d2("uLights.direction.3d."+dL,dx,"uLights"+dL+".direction",ec);d2("uLights.concentration.3d."+dL,dx,"uLights"+dL+".concentration",eg);d2("uLights.angle.3d."+dL,dx,"uLights"+dL+".angle",ee);dZ("uLights.type.3d."+dL,dx,"uLights"+dL+".type",3);dZ("uLightCount3d",dx,"uLightCount",++dL)};bR.prototype.beginCamera=function(){throw"beginCamera() is not available in 2D mode"};bB.prototype.beginCamera=function(){if(ap){throw"You cannot call beginCamera() again before calling endCamera()"}ap=true;dJ=ch;aT=bV};bR.prototype.endCamera=function(){throw"endCamera() is not available in 2D mode"};bB.prototype.endCamera=function(){if(!ap){throw"You cannot call endCamera() before calling beginCamera()"}dJ.set(bV);aT.set(ch);ap=false};cW.camera=function(el,ek,ei,eg,ee,ed,et,er,ep){if(el===t){dl=cW.width/2;dj=cW.height/2;di=dj/q.tan(cK/2);el=dl;ek=dj;ei=di;eg=dl;ee=dj;ed=0;et=0;er=1;ep=0}var ef=new A(el-eg,ek-ee,ei-ed);var eh=new A(et,er,ep);ef.normalize();var ej=A.cross(eh,ef);eh=A.cross(ef,ej);ej.normalize();eh.normalize();var eu=ej.x,es=ej.y,eq=ej.z;var ec=eh.x,eb=eh.y,ea=eh.z;var eo=ef.x,en=ef.y,em=ef.z;bV.set(eu,es,eq,0,ec,eb,ea,0,eo,en,em,0,0,0,0,1);bV.translate(-el,-ek,-ei);ch.reset();ch.invApply(eu,es,eq,0,ec,eb,ea,0,eo,en,em,0,0,0,0,1);ch.translate(el,ek,ei);dJ.set(bV);aT.set(ch)};cW.perspective=function(ee,ec,ef,eb){if(arguments.length===0){dj=ae.height/2;di=dj/q.tan(cK/2);a0=di/10;av=di*10;b5=cW.width/cW.height;ee=cK;ec=b5;ef=a0;eb=av}var eg,ea,eh,ed;eg=ef*q.tan(ee/2);ea=-eg;eh=eg*ec;ed=ea*ec;cW.frustum(ed,eh,ea,eg,ef,eb)};bR.prototype.frustum=function(){throw"Processing.js: frustum() is not supported in 2D mode"};bB.prototype.frustum=function(eg,ec,eb,ef,ee,ea){ci=true;db=new aP;db.set(2*ee/(ec-eg),0,(ec+eg)/(ec-eg),0,0,2*ee/(ef-eb),(ef+eb)/(ef-eb),0,0,0,-(ea+ee)/(ea-ee),-(2*ea*ee)/(ea-ee),0,0,-1,0);var ed=new aP;ed.set(db);ed.transpose();d8.useProgram(dQ);a9("projection2d",dQ,"uProjection",false,ed.array());d8.useProgram(dx);a9("projection3d",dx,"uProjection",false,ed.array());d8.useProgram(bT);a9("uProjectionUS",bT,"uProjection",false,ed.array())};cW.ortho=function(eb,em,ea,ek,eh,eg){if(arguments.length===0){eb=0;em=cW.width;ea=0;ek=cW.height;eh=-10;eg=10}var el=2/(em-eb);var ej=2/(ek-ea);var ei=-2/(eg-eh);var ef=-(em+eb)/(em-eb);var ee=-(ek+ea)/(ek-ea);var ed=-(eg+eh)/(eg-eh);db=new aP;db.set(el,0,0,ef,0,ej,0,ee,0,0,ei,ed,0,0,0,1);var ec=new aP;ec.set(db);ec.transpose();d8.useProgram(dQ);a9("projection2d",dQ,"uProjection",false,ec.array());d8.useProgram(dx);a9("projection3d",dx,"uProjection",false,ec.array());d8.useProgram(bT);a9("uProjectionUS",bT,"uProjection",false,ec.array());ci=false};cW.printProjection=function(){db.print()};cW.printCamera=function(){bV.print()};bR.prototype.box=ds.prototype.a3DOnlyFunction;bB.prototype.box=function(ec,ef,eh){if(!ef||!eh){ef=eh=ec}var ee=new aP;ee.scale(ec,ef,eh);var eb=new aP;eb.scale(1,-1,1);eb.apply(dJ.array());eb.transpose();if(aH){d8.useProgram(dx);a9("model3d",dx,"uModel",false,ee.array());a9("view3d",dx,"uView",false,eb.array());d8.enable(d8.POLYGON_OFFSET_FILL);d8.polygonOffset(1,1);d2("color3d",dx,"uColor",bo);if(dL>0){var ed=new aP;ed.set(eb);var ea=new aP;ea.set(ee);ed.mult(ea);var eg=new aP;eg.set(ed);eg.invert();eg.transpose();a9("uNormalTransform3d",dx,"uNormalTransform",false,eg.array());dc("aNormal3d",dx,"aNormal",3,cJ)}else{cg("aNormal3d",dx,"aNormal")}dc("aVertex3d",dx,"aVertex",3,bh);cg("aColor3d",dx,"aColor");cg("aTexture3d",dx,"aTexture");d8.drawArrays(d8.TRIANGLES,0,dh.length/3);d8.disable(d8.POLYGON_OFFSET_FILL)}if(dW>0&&ce){d8.useProgram(dQ);a9("uModel2d",dQ,"uModel",false,ee.array());a9("uView2d",dQ,"uView",false,eb.array());d2("uColor2d",dQ,"uColor",c0);dZ("uIsDrawingText2d",dQ,"uIsDrawingText",false);dc("vertex2d",dQ,"aVertex",3,dk);cg("aTextureCoord2d",dQ,"aTextureCoord");d8.drawArrays(d8.LINES,0,bH.length/3)}};var cD=function(){var eb;cF=[];for(eb=0;eb<bM;eb++){cF.push(0);cF.push(-1);cF.push(0);cF.push(bt[eb]);cF.push(bs[eb]);cF.push(br[eb])}cF.push(0);cF.push(-1);cF.push(0);cF.push(bt[0]);cF.push(bs[0]);cF.push(br[0]);var ef,ec,ee;var ed=0;for(eb=2;eb<bL;eb++){ef=ec=ed;ed+=bM;ee=ed;for(var ea=0;ea<bM;ea++){cF.push(bt[ef]);cF.push(bs[ef]);cF.push(br[ef++]);cF.push(bt[ee]);cF.push(bs[ee]);cF.push(br[ee++])}ef=ec;ee=ed;cF.push(bt[ef]);cF.push(bs[ef]);cF.push(br[ef]);cF.push(bt[ee]);cF.push(bs[ee]);cF.push(br[ee])}for(eb=0;eb<bM;eb++){ee=ed+eb;cF.push(bt[ee]);cF.push(bs[ee]);cF.push(br[ee]);cF.push(0);cF.push(1);cF.push(0)}cF.push(bt[ed]);cF.push(bs[ed]);cF.push(br[ed]);cF.push(0);cF.push(1);cF.push(0);d8.bindBuffer(d8.ARRAY_BUFFER,bg);d8.bufferData(d8.ARRAY_BUFFER,new e(cF),d8.STATIC_DRAW)};cW.sphereDetail=function(eb,em){var eh;if(arguments.length===1){eb=em=arguments[0]}if(eb<3){eb=3}if(em<2){em=2}if(eb===bM&&em===bL){return}var el=720/eb;var ef=new e(eb);var ec=new e(eb);for(eh=0;eh<eb;eh++){ef[eh]=bl[eh*el%720|0];ec[eh]=ah[eh*el%720|0]}var ek=eb*(em-1)+2;var ej=0;bt=new e(ek);bs=new e(ek);br=new e(ek);var ei=720*0.5/em;var ee=ei;for(eh=1;eh<em;eh++){var ed=ah[ee%720|0];var ea=-bl[ee%720|0];for(var eg=0;eg<eb;eg++){bt[ej]=ef[eg]*ed;bs[ej]=ea;br[ej++]=ec[eg]*ed}ee+=ei}bM=eb;bL=em;cD()};bR.prototype.sphere=ds.prototype.a3DOnlyFunction;bB.prototype.sphere=function(){var ee=arguments[0];if(bM<3||bL<2){cW.sphereDetail(30)}var ed=new aP;ed.scale(ee,ee,ee);var eb=new aP;eb.scale(1,-1,1);eb.apply(dJ.array());eb.transpose();if(aH){if(dL>0){var ec=new aP;ec.set(eb);var ea=new aP;ea.set(ed);ec.mult(ea);var ef=new aP;ef.set(ec);ef.invert();ef.transpose();a9("uNormalTransform3d",dx,"uNormalTransform",false,ef.array());dc("aNormal3d",dx,"aNormal",3,bg)}else{cg("aNormal3d",dx,"aNormal")}d8.useProgram(dx);cg("aTexture3d",dx,"aTexture");a9("uModel3d",dx,"uModel",false,ed.array());a9("uView3d",dx,"uView",false,eb.array());dc("aVertex3d",dx,"aVertex",3,bg);cg("aColor3d",dx,"aColor");d8.enable(d8.POLYGON_OFFSET_FILL);d8.polygonOffset(1,1);d2("uColor3d",dx,"uColor",bo);d8.drawArrays(d8.TRIANGLE_STRIP,0,cF.length/3);d8.disable(d8.POLYGON_OFFSET_FILL)}if(dW>0&&ce){d8.useProgram(dQ);a9("uModel2d",dQ,"uModel",false,ed.array());a9("uView2d",dQ,"uView",false,eb.array());dc("aVertex2d",dQ,"aVertex",3,bg);cg("aTextureCoord2d",dQ,"aTextureCoord");d2("uColor2d",dQ,"uColor",c0);dZ("uIsDrawingText",dQ,"uIsDrawingText",false);d8.drawArrays(d8.LINE_STRIP,0,cF.length/3)}};cW.modelX=function(eg,ef,ee){var ei=dJ.array();var ek=ch.array();var ea=ei[0]*eg+ei[1]*ef+ei[2]*ee+ei[3];var ej=ei[4]*eg+ei[5]*ef+ei[6]*ee+ei[7];var eh=ei[8]*eg+ei[9]*ef+ei[10]*ee+ei[11];var eb=ei[12]*eg+ei[13]*ef+ei[14]*ee+ei[15];var ec=ek[0]*ea+ek[1]*ej+ek[2]*eh+ek[3]*eb;var ed=ek[12]*ea+ek[13]*ej+ek[14]*eh+ek[15]*eb;return ed!==0?ec/ed:ec};cW.modelY=function(eg,ef,ee){var ei=dJ.array();var ek=ch.array();var ea=ei[0]*eg+ei[1]*ef+ei[2]*ee+ei[3];var ej=ei[4]*eg+ei[5]*ef+ei[6]*ee+ei[7];var eh=ei[8]*eg+ei[9]*ef+ei[10]*ee+ei[11];var eb=ei[12]*eg+ei[13]*ef+ei[14]*ee+ei[15];var ec=ek[4]*ea+ek[5]*ej+ek[6]*eh+ek[7]*eb;var ed=ek[12]*ea+ek[13]*ej+ek[14]*eh+ek[15]*eb;return ed!==0?ec/ed:ec};cW.modelZ=function(eg,ef,ee){var ei=dJ.array();var ek=ch.array();var ea=ei[0]*eg+ei[1]*ef+ei[2]*ee+ei[3];var ej=ei[4]*eg+ei[5]*ef+ei[6]*ee+ei[7];var eh=ei[8]*eg+ei[9]*ef+ei[10]*ee+ei[11];var ec=ei[12]*eg+ei[13]*ef+ei[14]*ee+ei[15];var eb=ek[8]*ea+ek[9]*ej+ek[10]*eh+ek[11]*ec;var ed=ek[12]*ea+ek[13]*ej+ek[14]*eh+ek[15]*ec;return ed!==0?eb/ed:eb};bR.prototype.ambient=ds.prototype.a3DOnlyFunction;bB.prototype.ambient=function(ed,ec,eb){d8.useProgram(dx);dZ("uUsingMat3d",dx,"uUsingMat",true);var ea=cW.color(ed,ec,eb);d2("uMaterialAmbient3d",dx,"uMaterialAmbient",cW.color.toGLArray(ea).slice(0,3))};bR.prototype.emissive=ds.prototype.a3DOnlyFunction;bB.prototype.emissive=function(ed,ec,eb){d8.useProgram(dx);dZ("uUsingMat3d",dx,"uUsingMat",true);var ea=cW.color(ed,ec,eb);d2("uMaterialEmissive3d",dx,"uMaterialEmissive",cW.color.toGLArray(ea).slice(0,3))};bR.prototype.shininess=ds.prototype.a3DOnlyFunction;bB.prototype.shininess=function(ea){d8.useProgram(dx);dZ("uUsingMat3d",dx,"uUsingMat",true);d2("uShininess3d",dx,"uShininess",ea)};bR.prototype.specular=ds.prototype.a3DOnlyFunction;bB.prototype.specular=function(ed,ec,eb){d8.useProgram(dx);dZ("uUsingMat3d",dx,"uUsingMat",true);var ea=cW.color(ed,ec,eb);d2("uMaterialSpecular3d",dx,"uMaterialSpecular",cW.color.toGLArray(ea).slice(0,3))};cW.screenX=function(eh,eg,ef){var ej=dJ.array();if(ej.length===16){var ea=ej[0]*eh+ej[1]*eg+ej[2]*ef+ej[3];var ek=ej[4]*eh+ej[5]*eg+ej[6]*ef+ej[7];var ei=ej[8]*eh+ej[9]*eg+ej[10]*ef+ej[11];var eb=ej[12]*eh+ej[13]*eg+ej[14]*ef+ej[15];var ee=db.array();var ec=ee[0]*ea+ee[1]*ek+ee[2]*ei+ee[3]*eb;var ed=ee[12]*ea+ee[13]*ek+ee[14]*ei+ee[15]*eb;if(ed!==0){ec/=ed}return cW.width*(1+ec)/2}return dJ.multX(eh,eg)};cW.screenY=function aA(eh,eg,ef){var ej=dJ.array();if(ej.length===16){var ea=ej[0]*eh+ej[1]*eg+ej[2]*ef+ej[3];var ek=ej[4]*eh+ej[5]*eg+ej[6]*ef+ej[7];var ei=ej[8]*eh+ej[9]*eg+ej[10]*ef+ej[11];var eb=ej[12]*eh+ej[13]*eg+ej[14]*ef+ej[15];var ee=db.array();var ec=ee[4]*ea+ee[5]*ek+ee[6]*ei+ee[7]*eb;var ed=ee[12]*ea+ee[13]*ek+ee[14]*ei+ee[15]*eb;if(ed!==0){ec/=ed}return cW.height*(1+ec)/2}return dJ.multY(eh,eg)};cW.screenZ=function ay(eh,eg,ef){var ej=dJ.array();if(ej.length!==16){return 0}var ee=db.array();var ea=ej[0]*eh+ej[1]*eg+ej[2]*ef+ej[3];var ek=ej[4]*eh+ej[5]*eg+ej[6]*ef+ej[7];var ei=ej[8]*eh+ej[9]*eg+ej[10]*ef+ej[11];var ec=ej[12]*eh+ej[13]*eg+ej[14]*ef+ej[15];var eb=ee[8]*ea+ee[9]*ek+ee[10]*ei+ee[11]*ec;var ed=ee[12]*ea+ee[13]*ek+ee[14]*ei+ee[15]*ec;if(ed!==0){eb/=ed}return(eb+1)/2};ds.prototype.fill=function(){var ea=cW.color(arguments[0],arguments[1],arguments[2],arguments[3]);if(ea===a1&&aH){return}aH=true;a1=ea};bR.prototype.fill=function(){ds.prototype.fill.apply(this,arguments);aq=true};bB.prototype.fill=function(){ds.prototype.fill.apply(this,arguments);bo=cW.color.toGLArray(a1)};function bn(){if(aH){if(aq){d8.fillStyle=cW.color.toString(a1);aq=false}d8.fill()}}cW.noFill=function(){aH=false};ds.prototype.stroke=function(){var ea=cW.color(arguments[0],arguments[1],arguments[2],arguments[3]);if(ea===cv&&ce){return}ce=true;cv=ea};bR.prototype.stroke=function(){ds.prototype.stroke.apply(this,arguments);b3=true};bB.prototype.stroke=function(){ds.prototype.stroke.apply(this,arguments);c0=cW.color.toGLArray(cv)};function dd(){if(ce){if(b3){d8.strokeStyle=cW.color.toString(cv);b3=false}d8.stroke()}}cW.noStroke=function(){ce=false};ds.prototype.strokeWeight=function(ea){dW=ea};bR.prototype.strokeWeight=function(ea){ds.prototype.strokeWeight.apply(this,arguments);d8.lineWidth=ea};bB.prototype.strokeWeight=function(ea){ds.prototype.strokeWeight.apply(this,arguments);d8.useProgram(dQ);d2("pointSize2d",dQ,"uPointSize",ea);d8.useProgram(bT);d2("pointSizeUnlitShape",bT,"uPointSize",ea);d8.lineWidth(ea)};cW.strokeCap=function(ea){dY.$ensureContext().lineCap=ea};cW.strokeJoin=function(ea){dY.$ensureContext().lineJoin=ea};bR.prototype.smooth=function(){dO=true;var ea=ae.style;ea.setProperty("image-rendering","optimizeQuality","important");ea.setProperty("-ms-interpolation-mode","bicubic","important");if(d8.hasOwnProperty("mozImageSmoothingEnabled")){d8.mozImageSmoothingEnabled=true}};bB.prototype.smooth=function(){dO=true};bR.prototype.noSmooth=function(){dO=false;var ea=ae.style;ea.setProperty("image-rendering","optimizeSpeed","important");ea.setProperty("image-rendering","-moz-crisp-edges","important");ea.setProperty("image-rendering","-webkit-optimize-contrast","important");ea.setProperty("image-rendering","optimize-contrast","important");ea.setProperty("-ms-interpolation-mode","nearest-neighbor","important");if(d8.hasOwnProperty("mozImageSmoothingEnabled")){d8.mozImageSmoothingEnabled=false}};bB.prototype.noSmooth=function(){dO=false};bR.prototype.point=function(ea,eb){if(!ce){return}ea=q.round(ea);eb=q.round(eb);d8.fillStyle=cW.color.toString(cv);aq=true;if(dW>1){d8.beginPath();d8.arc(ea,eb,dW/2,0,6.283185307179586,false);d8.fill()}else{d8.fillRect(ea,eb,1,1)}};bB.prototype.point=function(ea,ee,ed){var ec=new aP;ec.translate(ea,ee,ed||0);ec.transpose();var eb=new aP;eb.scale(1,-1,1);eb.apply(dJ.array());eb.transpose();d8.useProgram(dQ);a9("uModel2d",dQ,"uModel",false,ec.array());a9("uView2d",dQ,"uView",false,eb.array());if(dW>0&&ce){d2("uColor2d",dQ,"uColor",c0);dZ("uIsDrawingText2d",dQ,"uIsDrawingText",false);dZ("uSmooth2d",dQ,"uSmooth",dO);dc("aVertex2d",dQ,"aVertex",3,aw);cg("aTextureCoord2d",dQ,"aTextureCoord");d8.drawArrays(d8.POINTS,0,1)}};cW.beginShape=function(ea){dR=ea;d6=[];bb=[]};bR.prototype.vertex=function(eb,ed,ea){var ec=[];if(du){du=false}ec.isVert=true;ec[0]=eb;ec[1]=ed;ec[2]=0;ec[3]=0;ec[4]=0;ec[5]=a1;ec[6]=cv;bb.push(ec);if(ea){bb[bb.length-1]["moveTo"]=ea}};bB.prototype.vertex=function(ea,ef,ee,ed,ec){var eb=[];if(du){du=false}eb.isVert=true;if(ec===t&&dT){ec=ed;ed=ee;ee=0}if(ed!==t&&ec!==t){if(d4===2){ed/=cs.width;ec/=cs.height}ed=ed>1?1:ed;ed=ed<0?0:ed;ec=ec>1?1:ec;ec=ec<0?0:ec}eb[0]=ea;eb[1]=ef;eb[2]=ee||0;eb[3]=ed||0;eb[4]=ec||0;eb[5]=bo[0];eb[6]=bo[1];eb[7]=bo[2];eb[8]=bo[3];eb[9]=c0[0];eb[10]=c0[1];eb[11]=c0[2];eb[12]=c0[3];eb[13]=a8;eb[14]=a7;eb[15]=a6;bb.push(eb)};var d1=function(ec,eb){var ea=new aP;ea.scale(1,-1,1);ea.apply(dJ.array());ea.transpose();d8.useProgram(bT);a9("uViewUS",bT,"uView",false,ea.array());dZ("uSmoothUS",bT,"uSmooth",dO);dc("aVertexUS",bT,"aVertex",3,aw);d8.bufferData(d8.ARRAY_BUFFER,new e(ec),d8.STREAM_DRAW);dc("aColorUS",bT,"aColor",4,aG);d8.bufferData(d8.ARRAY_BUFFER,new e(eb),d8.STREAM_DRAW);d8.drawArrays(d8.POINTS,0,ec.length/3)};var bj=function(ee,ed,ec){var eb;if(ed==="LINES"){eb=d8.LINES}else{if(ed==="LINE_LOOP"){eb=d8.LINE_LOOP}else{eb=d8.LINE_STRIP}}var ea=new aP;ea.scale(1,-1,1);ea.apply(dJ.array());ea.transpose();d8.useProgram(bT);a9("uViewUS",bT,"uView",false,ea.array());dc("aVertexUS",bT,"aVertex",3,b8);d8.bufferData(d8.ARRAY_BUFFER,new e(ee),d8.STREAM_DRAW);dc("aColorUS",bT,"aColor",4,bC);d8.bufferData(d8.ARRAY_BUFFER,new e(ec),d8.STREAM_DRAW);d8.drawArrays(eb,0,ee.length/3)};var dm=function(ef,ee,ed,ec){var eb;if(ee==="TRIANGLES"){eb=d8.TRIANGLES}else{if(ee==="TRIANGLE_FAN"){eb=d8.TRIANGLE_FAN}else{eb=d8.TRIANGLE_STRIP}}var ea=new aP;ea.scale(1,-1,1);ea.apply(dJ.array());ea.transpose();d8.useProgram(dx);a9("model3d",dx,"uModel",false,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);a9("view3d",dx,"uView",false,ea.array());d8.enable(d8.POLYGON_OFFSET_FILL);d8.polygonOffset(1,1);d2("color3d",dx,"uColor",[-1,0,0,0]);dc("vertex3d",dx,"aVertex",3,at);d8.bufferData(d8.ARRAY_BUFFER,new e(ef),d8.STREAM_DRAW);if(dT&&bf!==null){bw(ed)}dc("aColor3d",dx,"aColor",4,aG);d8.bufferData(d8.ARRAY_BUFFER,new e(ed),d8.STREAM_DRAW);cg("aNormal3d",dx,"aNormal");if(dT){dZ("uUsingTexture3d",dx,"uUsingTexture",dT);dc("aTexture3d",dx,"aTexture",2,af);d8.bufferData(d8.ARRAY_BUFFER,new e(ec),d8.STREAM_DRAW)}d8.drawArrays(eb,0,ef.length/3);d8.disable(d8.POLYGON_OFFSET_FILL)};function cS(){bn();dd();d8.closePath()}bR.prototype.endShape=function(eh){if(bb.length===0){return}var ed=eh===2;if(ed){bb.push(bb[0])}var ec=[];var ea=[];var ej=[];var em=[];var ef=[];var ei;du=true;var eg,ee,eb;var el=bb.length;for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ea.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=5;ee<9;ee++){ej.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=9;ee<13;ee++){em.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];ef.push(ei[3]);ef.push(ei[4])}if(dP&&(dR===20||dR===t)){if(el>3){var ek=[],en=1-aJ;d8.beginPath();d8.moveTo(bb[1][0],bb[1][1]);for(eg=1;eg+2<el;eg++){ei=bb[eg];ek[0]=[ei[0],ei[1]];ek[1]=[ei[0]+(en*bb[eg+1][0]-en*bb[eg-1][0])/6,ei[1]+(en*bb[eg+1][1]-en*bb[eg-1][1])/6];ek[2]=[bb[eg+1][0]+(en*bb[eg][0]-en*bb[eg+2][0])/6,bb[eg+1][1]+(en*bb[eg][1]-en*bb[eg+2][1])/6];ek[3]=[bb[eg+1][0],bb[eg+1][1]];d8.bezierCurveTo(ek[1][0],ek[1][1],ek[2][0],ek[2][1],ek[3][0],ek[3][1])}cS()}}else{if(aa&&(dR===20||dR===t)){d8.beginPath();for(eg=0;eg<el;eg++){ei=bb[eg];if(bb[eg]["isVert"]){if(bb[eg]["moveTo"]){d8.moveTo(ei[0],ei[1])}else{d8.lineTo(ei[0],ei[1])}}else{d8.bezierCurveTo(bb[eg][0],bb[eg][1],bb[eg][2],bb[eg][3],bb[eg][4],bb[eg][5])}}cS()}else{if(dR===2){for(eg=0;eg<el;eg++){ei=bb[eg];if(ce){cW.stroke(ei[6])}cW.point(ei[0],ei[1])}}else{if(dR===4){for(eg=0;eg+1<el;eg+=2){ei=bb[eg];if(ce){cW.stroke(bb[eg+1][6])}cW.line(ei[0],ei[1],bb[eg+1][0],bb[eg+1][1])}}else{if(dR===9){for(eg=0;eg+2<el;eg+=3){ei=bb[eg];d8.beginPath();d8.moveTo(ei[0],ei[1]);d8.lineTo(bb[eg+1][0],bb[eg+1][1]);d8.lineTo(bb[eg+2][0],bb[eg+2][1]);d8.lineTo(ei[0],ei[1]);if(aH){cW.fill(bb[eg+2][5]);bn()}if(ce){cW.stroke(bb[eg+2][6]);dd()}d8.closePath()}}else{if(dR===10){for(eg=0;eg+1<el;eg++){ei=bb[eg];d8.beginPath();d8.moveTo(bb[eg+1][0],bb[eg+1][1]);d8.lineTo(ei[0],ei[1]);if(ce){cW.stroke(bb[eg+1][6])}if(aH){cW.fill(bb[eg+1][5])}if(eg+2<el){d8.lineTo(bb[eg+2][0],bb[eg+2][1]);if(ce){cW.stroke(bb[eg+2][6])}if(aH){cW.fill(bb[eg+2][5])}}cS()}}else{if(dR===11){if(el>2){d8.beginPath();d8.moveTo(bb[0][0],bb[0][1]);d8.lineTo(bb[1][0],bb[1][1]);d8.lineTo(bb[2][0],bb[2][1]);if(aH){cW.fill(bb[2][5]);bn()}if(ce){cW.stroke(bb[2][6]);dd()}d8.closePath();for(eg=3;eg<el;eg++){ei=bb[eg];d8.beginPath();d8.moveTo(bb[0][0],bb[0][1]);d8.lineTo(bb[eg-1][0],bb[eg-1][1]);d8.lineTo(ei[0],ei[1]);if(aH){cW.fill(ei[5]);bn()}if(ce){cW.stroke(ei[6]);dd()}d8.closePath()}}}else{if(dR===16){for(eg=0;eg+3<el;eg+=4){ei=bb[eg];d8.beginPath();d8.moveTo(ei[0],ei[1]);for(ee=1;ee<4;ee++){d8.lineTo(bb[eg+ee][0],bb[eg+ee][1])}d8.lineTo(ei[0],ei[1]);if(aH){cW.fill(bb[eg+3][5]);bn()}if(ce){cW.stroke(bb[eg+3][6]);dd()}d8.closePath()}}else{if(dR===17){if(el>3){for(eg=0;eg+1<el;eg+=2){ei=bb[eg];d8.beginPath();if(eg+3<el){d8.moveTo(bb[eg+2][0],bb[eg+2][1]);d8.lineTo(ei[0],ei[1]);d8.lineTo(bb[eg+1][0],bb[eg+1][1]);d8.lineTo(bb[eg+3][0],bb[eg+3][1]);if(aH){cW.fill(bb[eg+3][5])}if(ce){cW.stroke(bb[eg+3][6])}}else{d8.moveTo(ei[0],ei[1]);d8.lineTo(bb[eg+1][0],bb[eg+1][1])}cS()}}}else{d8.beginPath();d8.moveTo(bb[0][0],bb[0][1]);for(eg=1;eg<el;eg++){ei=bb[eg];if(ei.isVert){if(ei.moveTo){d8.moveTo(ei[0],ei[1])}else{d8.lineTo(ei[0],ei[1])}}}cS()}}}}}}}}}dP=false;aa=false;cb=[];c2=0;if(ed){bb.pop()}};bB.prototype.endShape=function(eh){if(bb.length===0){return}var ed=eh===2;var ec=[];var ea=[];var ej=[];var em=[];var ef=[];var ei;du=true;var eg,ee,eb;var el=bb.length;for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ea.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=5;ee<9;ee++){ej.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=9;ee<13;ee++){em.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];ef.push(ei[3]);ef.push(ei[4])}if(ed){ea.push(bb[0][0]);ea.push(bb[0][1]);ea.push(bb[0][2]);for(eg=5;eg<9;eg++){ej.push(bb[0][eg])}for(eg=9;eg<13;eg++){em.push(bb[0][eg])}ef.push(bb[0][3]);ef.push(bb[0][4])}if(dP&&(dR===20||dR===t)){ec=ea;if(ce){bj(ec,null,em)}if(aH){dm(ea,null,ej)}}else{if(aa&&(dR===20||dR===t)){ec=ea;ec.splice(ec.length-3);em.splice(em.length-4);if(ce){bj(ec,null,em)}if(aH){dm(ea,"TRIANGLES",ej)}}else{if(dR===2){for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ec.push(ei[ee])}}d1(ec,em)}else{if(dR===4){for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ec.push(ei[ee])}}for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=5;ee<9;ee++){ej.push(ei[ee])}}bj(ec,"LINES",em)}else{if(dR===9){if(el>2){for(eg=0;eg+2<el;eg+=3){ea=[];ef=[];ec=[];ej=[];em=[];for(ee=0;ee<3;ee++){for(eb=0;eb<3;eb++){ec.push(bb[eg+ee][eb]);ea.push(bb[eg+ee][eb])}}for(ee=0;ee<3;ee++){for(eb=3;eb<5;eb++){ef.push(bb[eg+ee][eb])}}for(ee=0;ee<3;ee++){for(eb=5;eb<9;eb++){ej.push(bb[eg+ee][eb]);em.push(bb[eg+ee][eb+4])}}if(ce){bj(ec,"LINE_LOOP",em)}if(aH||dT){dm(ea,"TRIANGLES",ej,ef)}}}}else{if(dR===10){if(el>2){for(eg=0;eg+2<el;eg++){ec=[];ea=[];em=[];ej=[];ef=[];for(ee=0;ee<3;ee++){for(eb=0;eb<3;eb++){ec.push(bb[eg+ee][eb]);ea.push(bb[eg+ee][eb])}}for(ee=0;ee<3;ee++){for(eb=3;eb<5;eb++){ef.push(bb[eg+ee][eb])}}for(ee=0;ee<3;ee++){for(eb=5;eb<9;eb++){em.push(bb[eg+ee][eb+4]);ej.push(bb[eg+ee][eb])}}if(aH||dT){dm(ea,"TRIANGLE_STRIP",ej,ef)}if(ce){bj(ec,"LINE_LOOP",em)}}}}else{if(dR===11){if(el>2){for(eg=0;eg<3;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ec.push(ei[ee])}}for(eg=0;eg<3;eg++){ei=bb[eg];for(ee=9;ee<13;ee++){em.push(ei[ee])}}if(ce){bj(ec,"LINE_LOOP",em)}for(eg=2;eg+1<el;eg++){ec=[];em=[];ec.push(bb[0][0]);ec.push(bb[0][1]);ec.push(bb[0][2]);em.push(bb[0][9]);em.push(bb[0][10]);em.push(bb[0][11]);em.push(bb[0][12]);for(ee=0;ee<2;ee++){for(eb=0;eb<3;eb++){ec.push(bb[eg+ee][eb])}}for(ee=0;ee<2;ee++){for(eb=9;eb<13;eb++){em.push(bb[eg+ee][eb])}}if(ce){bj(ec,"LINE_STRIP",em)}}if(aH||dT){dm(ea,"TRIANGLE_FAN",ej,ef)}}}else{if(dR===16){for(eg=0;eg+3<el;eg+=4){ec=[];for(ee=0;ee<4;ee++){ei=bb[eg+ee];for(eb=0;eb<3;eb++){ec.push(ei[eb])}}if(ce){bj(ec,"LINE_LOOP",em)}if(aH){ea=[];ej=[];ef=[];for(ee=0;ee<3;ee++){ea.push(bb[eg][ee])}for(ee=5;ee<9;ee++){ej.push(bb[eg][ee])}for(ee=0;ee<3;ee++){ea.push(bb[eg+1][ee])}for(ee=5;ee<9;ee++){ej.push(bb[eg+1][ee])}for(ee=0;ee<3;ee++){ea.push(bb[eg+3][ee])}for(ee=5;ee<9;ee++){ej.push(bb[eg+3][ee])}for(ee=0;ee<3;ee++){ea.push(bb[eg+2][ee])}for(ee=5;ee<9;ee++){ej.push(bb[eg+2][ee])}if(dT){ef.push(bb[eg+0][3]);ef.push(bb[eg+0][4]);ef.push(bb[eg+1][3]);ef.push(bb[eg+1][4]);ef.push(bb[eg+3][3]);ef.push(bb[eg+3][4]);ef.push(bb[eg+2][3]);ef.push(bb[eg+2][4])}dm(ea,"TRIANGLE_STRIP",ej,ef)}}}else{if(dR===17){var ek=[];if(el>3){for(eg=0;eg<2;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ec.push(ei[ee])}}for(eg=0;eg<2;eg++){ei=bb[eg];for(ee=9;ee<13;ee++){em.push(ei[ee])}}bj(ec,"LINE_STRIP",em);if(el>4&&el%2>0){ek=ea.splice(ea.length-3);bb.pop()}for(eg=0;eg+3<el;eg+=2){ec=[];em=[];for(ee=0;ee<3;ee++){ec.push(bb[eg+1][ee])}for(ee=0;ee<3;ee++){ec.push(bb[eg+3][ee])}for(ee=0;ee<3;ee++){ec.push(bb[eg+2][ee])}for(ee=0;ee<3;ee++){ec.push(bb[eg+0][ee])}for(ee=9;ee<13;ee++){em.push(bb[eg+1][ee])}for(ee=9;ee<13;ee++){em.push(bb[eg+3][ee])}for(ee=9;ee<13;ee++){em.push(bb[eg+2][ee])}for(ee=9;ee<13;ee++){em.push(bb[eg+0][ee])}if(ce){bj(ec,"LINE_STRIP",em)}}if(aH||dT){dm(ea,"TRIANGLE_LIST",ej,ef)}}}else{if(el===1){for(ee=0;ee<3;ee++){ec.push(bb[0][ee])}for(ee=9;ee<13;ee++){em.push(bb[0][ee])}d1(ec,em)}else{for(eg=0;eg<el;eg++){ei=bb[eg];for(ee=0;ee<3;ee++){ec.push(ei[ee])}for(ee=5;ee<9;ee++){em.push(ei[ee])}}if(ce&&ed){bj(ec,"LINE_LOOP",em)}else{if(ce&&!ed){bj(ec,"LINE_STRIP",em)}}if(aH||dT){dm(ea,"TRIANGLE_FAN",ej,ef)}}}}}}}}}dT=false;d8.useProgram(dx);dZ("usingTexture3d",dx,"uUsingTexture",dT)}}dP=false;aa=false;cb=[];c2=0};var aY=function(ed,ec){var ee=1/ed;var eb=ee*ee;var ea=eb*ee;ec.set(0,0,0,1,ea,eb,ee,0,6*ea,2*eb,0,0,6*ea,0,0,0)};var dr=function(){if(!aL){c3=new aP;aL=new aP;cM=true}var ea=aJ;c3.set((ea-1)/2,(ea+3)/2,(-3-ea)/2,(1-ea)/2,1-ea,(-5-ea)/2,ea+2,(ea-1)/2,(ea-1)/2,0,(1-ea)/2,0,0,1,0,0);aY(Q,aL);if(!cd){aQ=new aP}aQ.set(c3);aQ.preApply(cd);aL.apply(c3)};bR.prototype.bezierVertex=function(){aa=true;var ea=[];if(du){throw"vertex() must be used at least once before calling bezierVertex()"}for(var eb=0;eb<arguments.length;eb++){ea[eb]=arguments[eb]}bb.push(ea);bb[bb.length-1]["isVert"]=false};bB.prototype.bezierVertex=function(){aa=true;var eh=[];if(du){throw"vertex() must be used at least once before calling bezierVertex()"}if(arguments.length===9){if(bz===t){bz=new aP}var em=bb.length-1;aY(cy,bz);bz.apply(U);var eo=bz.array();var ed=bb[em][0],en=bb[em][1],eg=bb[em][2];var ej=eo[4]*ed+eo[5]*arguments[0]+eo[6]*arguments[3]+eo[7]*arguments[6];var ei=eo[8]*ed+eo[9]*arguments[0]+eo[10]*arguments[3]+eo[11]*arguments[6];var ef=eo[12]*ed+eo[13]*arguments[0]+eo[14]*arguments[3]+eo[15]*arguments[6];var ep=eo[4]*en+eo[5]*arguments[1]+eo[6]*arguments[4]+eo[7]*arguments[7];var el=eo[8]*en+eo[9]*arguments[1]+eo[10]*arguments[4]+eo[11]*arguments[7];var ek=eo[12]*en+eo[13]*arguments[1]+eo[14]*arguments[4]+eo[15]*arguments[7];var ec=eo[4]*eg+eo[5]*arguments[2]+eo[6]*arguments[5]+eo[7]*arguments[8];var eb=eo[8]*eg+eo[9]*arguments[2]+eo[10]*arguments[5]+eo[11]*arguments[8];var ea=eo[12]*eg+eo[13]*arguments[2]+eo[14]*arguments[5]+eo[15]*arguments[8];for(var ee=0;ee<cy;ee++){ed+=ej;ej+=ei;ei+=ef;en+=ep;ep+=el;el+=ek;eg+=ec;ec+=eb;eb+=ea;cW.vertex(ed,en,eg)}cW.vertex(arguments[6],arguments[7],arguments[8])}};cW.texture=function(ed){var eb=dY.$ensureContext();if(ed.__texture){eb.bindTexture(eb.TEXTURE_2D,ed.__texture)}else{if(ed.localName==="canvas"){eb.bindTexture(eb.TEXTURE_2D,c7);eb.texImage2D(eb.TEXTURE_2D,0,eb.RGBA,eb.RGBA,eb.UNSIGNED_BYTE,ed);eb.texParameteri(eb.TEXTURE_2D,eb.TEXTURE_MAG_FILTER,eb.LINEAR);eb.texParameteri(eb.TEXTURE_2D,eb.TEXTURE_MIN_FILTER,eb.LINEAR);eb.generateMipmap(eb.TEXTURE_2D);cs.width=ed.width;cs.height=ed.height}else{var ec=eb.createTexture(),ef=d.createElement("canvas"),ea=ef.getContext("2d"),ee;if(ed.width&ed.width-1===0){ef.width=ed.width}else{ee=1;while(ee<ed.width){ee*=2}ef.width=ee}if(ed.height&ed.height-1===0){ef.height=ed.height}else{ee=1;while(ee<ed.height){ee*=2}ef.height=ee}ea.drawImage(ed.sourceImg,0,0,ed.width,ed.height,0,0,ef.width,ef.height);eb.bindTexture(eb.TEXTURE_2D,ec);eb.texParameteri(eb.TEXTURE_2D,eb.TEXTURE_MIN_FILTER,eb.LINEAR_MIPMAP_LINEAR);eb.texParameteri(eb.TEXTURE_2D,eb.TEXTURE_MAG_FILTER,eb.LINEAR);eb.texParameteri(eb.TEXTURE_2D,eb.TEXTURE_WRAP_T,eb.CLAMP_TO_EDGE);eb.texParameteri(eb.TEXTURE_2D,eb.TEXTURE_WRAP_S,eb.CLAMP_TO_EDGE);eb.texImage2D(eb.TEXTURE_2D,0,eb.RGBA,eb.RGBA,eb.UNSIGNED_BYTE,ef);eb.generateMipmap(eb.TEXTURE_2D);ed.__texture=ec;cs.width=ed.width;cs.height=ed.height}}dT=true;eb.useProgram(dx);dZ("usingTexture3d",dx,"uUsingTexture",dT)};cW.textureMode=function(ea){d4=ea};var ar=function(ev,eg,em,et,ef,el,er,ee,ek,ep,ed,ei){var ew=et;var eh=ef;var en=el;var ej=aL.array();var eu=ej[4]*ev+ej[5]*et+ej[6]*er+ej[7]*ep;var es=ej[8]*ev+ej[9]*et+ej[10]*er+ej[11]*ep;var eq=ej[12]*ev+ej[13]*et+ej[14]*er+ej[15]*ep;var ez=ej[4]*eg+ej[5]*ef+ej[6]*ee+ej[7]*ed;var ey=ej[8]*eg+ej[9]*ef+ej[10]*ee+ej[11]*ed;var ex=ej[12]*eg+ej[13]*ef+ej[14]*ee+ej[15]*ed;var ec=ej[4]*em+ej[5]*el+ej[6]*ek+ej[7]*ei;var eb=ej[8]*em+ej[9]*el+ej[10]*ek+ej[11]*ei;var ea=ej[12]*em+ej[13]*el+ej[14]*ek+ej[15]*ei;cW.vertex(ew,eh,en);for(var eo=0;eo<Q;eo++){ew+=eu;eu+=es;es+=eq;eh+=ez;ez+=ey;ey+=ex;en+=ec;ec+=eb;eb+=ea;cW.vertex(ew,eh,en)}};bR.prototype.curveVertex=function(ea,eb){dP=true;cW.vertex(ea,eb)};bB.prototype.curveVertex=function(ea,ed,ec){dP=true;if(!cM){dr()}var eb=[];eb[0]=ea;eb[1]=ed;eb[2]=ec;cb.push(eb);c2++;if(c2>3){ar(cb[c2-4][0],cb[c2-4][1],cb[c2-4][2],cb[c2-3][0],cb[c2-3][1],cb[c2-3][2],cb[c2-2][0],cb[c2-2][1],cb[c2-2][2],cb[c2-1][0],cb[c2-1][1],cb[c2-1][2])}};bR.prototype.curve=function(ef,eh,ed,eg,eb,ee,ea,ec){cW.beginShape();cW.curveVertex(ef,eh);cW.curveVertex(ed,eg);cW.curveVertex(eb,ee);cW.curveVertex(ea,ec);cW.endShape()};bB.prototype.curve=function(ec,ek,eg,eb,ej,ef,ea,ei,ee,el,eh,ed){if(ed!==t){cW.beginShape();cW.curveVertex(ec,ek,eg);cW.curveVertex(eb,ej,ef);cW.curveVertex(ea,ei,ee);cW.curveVertex(el,eh,ed);cW.endShape();return}cW.beginShape();cW.curveVertex(ec,ek);cW.curveVertex(eg,eb);cW.curveVertex(ej,ef);cW.curveVertex(ea,ei);cW.endShape()};cW.curveTightness=function(ea){aJ=ea};cW.curveDetail=function(ea){Q=ea;dr()};cW.rectMode=function(ea){bK=ea};cW.imageMode=function(ea){switch(ea){case 0:bk=aZ;break;case 1:bk=b1;break;case 3:bk=aN;break;default:throw"Invalid imageMode"}};cW.ellipseMode=function(ea){cN=ea};cW.arc=function(em,ek,ed,eo,ec,el){if(ed<=0||el<ec){return}if(cN===1){ed=ed-em;eo=eo-ek}else{if(cN===2){em=em-ed;ek=ek-eo;ed=ed*2;eo=eo*2}else{if(cN===3){em=em-ed/2;ek=ek-eo/2}}}while(ec<0){ec+=6.283185307179586;el+=6.283185307179586}if(el-ec>6.283185307179586){ec=0;el=6.283185307179586}var en=ed/2,ep=eo/2,eh=em+en,ef=ek+ep,eb=0|0.5+ec*cW.RAD_TO_DEG*2,ej=0|0.5+el*cW.RAD_TO_DEG*2,ei,eg;if(aH){var ee=ce;ce=false;cW.beginShape();cW.vertex(eh,ef);for(ei=eb;ei<=ej;ei++){eg=ei%720;cW.vertex(eh+bl[eg]*en,ef+ah[eg]*ep)}cW.endShape(2);ce=ee}if(ce){var ea=aH;aH=false;cW.beginShape();for(ei=eb;ei<=ej;ei++){eg=ei%720;cW.vertex(eh+bl[eg]*en,ef+ah[eg]*ep)}cW.endShape();aH=ea}};bR.prototype.line=function(eb,ei,ea,eg){if(!ce){return}eb=q.round(eb);ea=q.round(ea);ei=q.round(ei);eg=q.round(eg);if(eb===ea&&ei===eg){cW.point(eb,ei);return}var ec=t,ej=t,ef=true,eh=dJ.array(),ed=[1,0,0,0,1,0];for(var ee=0;ee<6&&ef;ee++){ef=eh[ee]===ed[ee]}if(ef){if(eb===ea){if(ei>eg){ec=ei;ei=eg;eg=ec}eg++;if(dW%2===1){d8.translate(0.5,0)}}else{if(ei===eg){if(eb>ea){ec=eb;eb=ea;ea=ec}ea++;if(dW%2===1){d8.translate(0,0.5)}}}if(dW===1){ej=d8.lineCap;d8.lineCap="butt"}}d8.beginPath();d8.moveTo(eb||0,ei||0);d8.lineTo(ea||0,eg||0);dd();if(ef){if(eb===ea&&dW%2===1){d8.translate(-0.5,0)}else{if(ei===eg&&dW%2===1){d8.translate(0,-0.5)}}if(dW===1){d8.lineCap=ej}}};bB.prototype.line=function(ec,ef,eh,eb,ed,eg){if(ed===t||eg===t){eg=0;ed=eb;eb=eh;eh=0}if(ec===eb&&ef===ed&&eh===eg){cW.point(ec,ef,eh);return}var ee=[ec,ef,eh,eb,ed,eg];var ea=new aP;ea.scale(1,-1,1);ea.apply(dJ.array());ea.transpose();if(dW>0&&ce){d8.useProgram(dQ);a9("uModel2d",dQ,"uModel",false,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);a9("uView2d",dQ,"uView",false,ea.array());d2("uColor2d",dQ,"uColor",c0);dZ("uIsDrawingText",dQ,"uIsDrawingText",false);dc("aVertex2d",dQ,"aVertex",3,b8);cg("aTextureCoord2d",dQ,"aTextureCoord");d8.bufferData(d8.ARRAY_BUFFER,new e(ee),d8.STREAM_DRAW);d8.drawArrays(d8.LINES,0,2)}};bR.prototype.bezier=function(){if(arguments.length!==8){throw"You must use 8 parameters for bezier() in 2D mode"}cW.beginShape();cW.vertex(arguments[0],arguments[1]);cW.bezierVertex(arguments[2],arguments[3],arguments[4],arguments[5],arguments[6],arguments[7]);cW.endShape()};bB.prototype.bezier=function(){if(arguments.length!==12){throw"You must use 12 parameters for bezier() in 3D mode"}cW.beginShape();cW.vertex(arguments[0],arguments[1],arguments[2]);cW.bezierVertex(arguments[3],arguments[4],arguments[5],arguments[6],arguments[7],arguments[8],arguments[9],arguments[10],arguments[11]);cW.endShape()};cW.bezierDetail=function(ea){cy=ea};cW.bezierPoint=function(eb,ea,ee,ed,ec){return(1-ec)*(1-ec)*(1-ec)*eb+3*(1-ec)*(1-ec)*ec*ea+3*(1-ec)*ec*ec*ee+ec*ec*ec*ed};cW.bezierTangent=function(eb,ea,ee,ed,ec){return 3*ec*ec*(-eb+3*ea-3*ee+ed)+6*ec*(eb-2*ea+ee)+3*(-eb+ea)};cW.curvePoint=function(eb,ea,ee,ed,ec){return 0.5*(2*ea+(-eb+ee)*ec+(2*eb-5*ea+4*ee-ed)*ec*ec+(-eb+3*ea-3*ee+ed)*ec*ec*ec)};cW.curveTangent=function(eb,ea,ee,ed,ec){return 0.5*(-eb+ee+2*(2*eb-5*ea+4*ee-ed)*ec+3*(-eb+3*ea-3*ee+ed)*ec*ec)};cW.triangle=function(ed,ef,eb,ee,ea,ec){cW.beginShape(9);cW.vertex(ed,ef,0);cW.vertex(eb,ee,0);cW.vertex(ea,ec,0);cW.endShape()};cW.quad=function(ef,eh,ed,eg,eb,ee,ea,ec){cW.beginShape(16);cW.vertex(ef,eh,0);cW.vertex(ed,eg,0);cW.vertex(eb,ee,0);cW.vertex(ea,ec,0);cW.endShape()};var bN=function(eg,ef,ea,eh,ej,ee,ei,eb){if(eb===t){ee=ej;ei=ej;eb=ej}var ec=ea/2,ed=eh/2;if(ej>ec||ej>ed){ej=q.min(ec,ed)}if(ee>ec||ee>ed){ee=q.min(ec,ed)}if(ei>ec||ei>ed){ei=q.min(ec,ed)}if(eb>ec||eb>ed){eb=q.min(ec,ed)}if(!aH||ce){d8.translate(0.5,0.5)}d8.beginPath();d8.moveTo(eg+ej,ef);d8.lineTo(eg+ea-ee,ef);d8.quadraticCurveTo(eg+ea,ef,eg+ea,ef+ee);d8.lineTo(eg+ea,ef+eh-ei);d8.quadraticCurveTo(eg+ea,ef+eh,eg+ea-ei,ef+eh);d8.lineTo(eg+eb,ef+eh);d8.quadraticCurveTo(eg,ef+eh,eg,ef+eh-eb);d8.lineTo(eg,ef+ej);d8.quadraticCurveTo(eg,ef,eg+ej,ef);if(!aH||ce){d8.translate(-0.5,-0.5)}bn();dd()};bR.prototype.rect=function(eb,eh,ee,ea,ec,ef,ed,eg){if(!ee&&!ea){return}if(bK===1){ee-=eb;ea-=eh}else{if(bK===2){ee*=2;ea*=2;eb-=ee/2;eh-=ea/2}else{if(bK===3){eb-=ee/2;eh-=ea/2}}}eb=q.round(eb);eh=q.round(eh);ee=q.round(ee);ea=q.round(ea);if(ec!==t){bN(eb,eh,ee,ea,ec,ef,ed,eg);return}if(ce&&dW%2===1){d8.translate(0.5,0.5)}d8.beginPath();d8.rect(eb,eh,ee,ea);bn();dd();if(ce&&dW%2===1){d8.translate(-0.5,-0.5)}};bB.prototype.rect=function(ei,eh,ea,ek,em,ef,el,eb){if(em!==t){throw"rect() with rounded corners is not supported in 3D mode"}if(bK===1){ea-=ei;ek-=eh}else{if(bK===2){ea*=2;ek*=2;ei-=ea/2;eh-=ek/2}else{if(bK===3){ei-=ea/2;eh-=ek/2}}}var ee=new aP;ee.translate(ei,eh,0);ee.scale(ea,ek,1);ee.transpose();var eg=new aP;eg.scale(1,-1,1);eg.apply(dJ.array());eg.transpose();if(dW>0&&ce){d8.useProgram(dQ);a9("uModel2d",dQ,"uModel",false,ee.array());a9("uView2d",dQ,"uView",false,eg.array());d2("uColor2d",dQ,"uColor",c0);dZ("uIsDrawingText2d",dQ,"uIsDrawingText",false);dc("aVertex2d",dQ,"aVertex",3,aB);cg("aTextureCoord2d",dQ,"aTextureCoord");d8.drawArrays(d8.LINE_LOOP,0,ak.length/3)}if(aH){d8.useProgram(dx);a9("uModel3d",dx,"uModel",false,ee.array());a9("uView3d",dx,"uView",false,eg.array());d8.enable(d8.POLYGON_OFFSET_FILL);d8.polygonOffset(1,1);d2("color3d",dx,"uColor",bo);if(dL>0){var ej=new aP;ej.set(eg);var ec=new aP;ec.set(ee);ej.mult(ec);var ed=new aP;ed.set(ej);ed.invert();ed.transpose();a9("uNormalTransform3d",dx,"uNormalTransform",false,ed.array());dc("aNormal3d",dx,"aNormal",3,b2)}else{cg("normal3d",dx,"aNormal")}dc("vertex3d",dx,"aVertex",3,aB);d8.drawArrays(d8.TRIANGLE_FAN,0,ak.length/3);d8.disable(d8.POLYGON_OFFSET_FILL)}};bR.prototype.ellipse=function(eg,ef,eb,ei){eg=eg||0;ef=ef||0;if(eb<=0&&ei<=0){return}if(cN===2){eb*=2;ei*=2}else{if(cN===1){eb=eb-eg;ei=ei-ef;eg+=eb/2;ef+=ei/2}else{if(cN===0){eg+=eb/2;ef+=ei/2}}}if(eb===ei){d8.beginPath();d8.arc(eg,ef,eb/2,0,6.283185307179586,false);bn();dd()}else{var eh=eb/2,ee=ei/2,ea=0.5522847498307933,ed=ea*eh,ec=ea*ee;cW.beginShape();cW.vertex(eg+eh,ef);cW.bezierVertex(eg+eh,ef-ec,eg+ed,ef-ee,eg,ef-ee);cW.bezierVertex(eg-ed,ef-ee,eg-eh,ef-ec,eg-eh,ef);cW.bezierVertex(eg-eh,ef+ec,eg-ed,ef+ee,eg,ef+ee);cW.bezierVertex(eg+ed,ef+ee,eg+eh,ef+ec,eg+eh,ef);cW.endShape()}};bB.prototype.ellipse=function(en,em,ec,ep){en=en||0;em=em||0;if(ec<=0&&ep<=0){return}if(cN===2){ec*=2;ep*=2}else{if(cN===1){ec=ec-en;ep=ep-em;en+=ec/2;em+=ep/2}else{if(cN===0){en+=ec/2;em+=ep/2}}}var eo=ec/2,ej=ep/2,ea=0.5522847498307933,ee=ea*eo,ed=ea*ej;cW.beginShape();cW.vertex(en+eo,em);cW.bezierVertex(en+eo,em-ed,0,en+ee,em-ej,0,en,em-ej,0);cW.bezierVertex(en-ee,em-ej,0,en-eo,em-ed,0,en-eo,em,0);cW.bezierVertex(en-eo,em+ed,0,en-ee,em+ej,0,en,em+ej,0);cW.bezierVertex(en+ee,em+ej,0,en+eo,em+ed,0,en+eo,em,0);cW.endShape();if(aH){var ef=0,ek=0,eh,eg;for(eh=0;eh<bb.length;eh++){ef+=bb[eh][0];ek+=bb[eh][1]}ef/=bb.length;ek/=bb.length;var ei=[],eb=[],el=[];ei[0]=ef;ei[1]=ek;ei[2]=0;ei[3]=0;ei[4]=0;ei[5]=bo[0];ei[6]=bo[1];ei[7]=bo[2];ei[8]=bo[3];ei[9]=c0[0];ei[10]=c0[1];ei[11]=c0[2];ei[12]=c0[3];ei[13]=a8;ei[14]=a7;ei[15]=a6;bb.unshift(ei);for(eh=0;eh<bb.length;eh++){for(eg=0;eg<3;eg++){eb.push(bb[eh][eg])}for(eg=5;eg<9;eg++){el.push(bb[eh][eg])}}dm(eb,"TRIANGLE_FAN",el)}};cW.normal=function(ea,ec,eb){if(arguments.length!==3||!(typeof ea==="number"&&typeof ec==="number"&&typeof eb==="number")){throw"normal() requires three numeric arguments."}a8=ea;a7=ec;a6=eb;if(dR!==0){if(a2===0){a2=1}else{if(a2===1){a2=2}}}};cW.save=function(eb,ea){if(ea!==t){return D.open(ea.toDataURL(),"_blank")}return D.open(cW.externals.canvas.toDataURL(),"_blank")};var cw=0;cW.saveFrame=function(ea){if(ea===t){ea="screen-####.png"}var eb=ea.replace(/#+/,function(ed){var ec=""+cw++;while(ec.length<ed.length){ec="0"+ec}return ec});cW.save(eb)};var cc=d.createElement("canvas").getContext("2d");var X=[t,t,t];function by(eh,eb,eg){var ed=X.shift();if(ed===t){ed={};ed.canvas=d.createElement("canvas");ed.context=ed.canvas.getContext("2d")}X.push(ed);var ec=ed.canvas,ee=ed.context,ef=eb||eh.width,ea=eg||eh.height;ec.width=ef;ec.height=ea;if(!eh){ee.clearRect(0,0,ef,ea)}else{if("data" in eh){ee.putImageData(eh,0,0)}else{ee.clearRect(0,0,ef,ea);ee.drawImage(eh,0,0,ef,ea)}}return ed}function b0(ea){return{getLength:function(eb){return function(){if(eb.isRemote){throw"Image is loaded remotely. Cannot get length."}else{return eb.imageData.data.length?eb.imageData.data.length/4:0}}}(ea),getPixel:function(eb){return function(ec){var ee=ec*4,ed=eb.imageData.data;if(eb.isRemote){throw"Image is loaded remotely. Cannot get pixels."}return(ed[ee+3]&255)<<24|(ed[ee]&255)<<16|(ed[ee+1]&255)<<8|ed[ee+2]&255}}(ea),setPixel:function(eb){return function(ec,ef){var ee=ec*4,ed=eb.imageData.data;if(eb.isRemote){throw"Image is loaded remotely. Cannot set pixel."}ed[ee+0]=(ef>>16)&255;ed[ee+1]=(ef>>8)&255;ed[ee+2]=ef&255;ed[ee+3]=(ef>>24)&255;eb.__isDirty=true}}(ea),toArray:function(eb){return function(){var ec=[],ef=eb.imageData.data,ee=eb.width*eb.height;if(eb.isRemote){throw"Image is loaded remotely. Cannot get pixels."}for(var ed=0,eg=0;ed<ee;ed++,eg+=4){ec.push((ef[eg+3]&255)<<24|(ef[eg]&255)<<16|(ef[eg+1]&255)<<8|ef[eg+2]&255)}return ec}}(ea),set:function(eb){return function(ec){var eg,ef,eh;if(this.isRemote){throw"Image is loaded remotely. Cannot set pixels."}ef=eb.imageData.data;for(var ed=0,ee=ec.length;ed<ee;ed++){eh=ec[ed];eg=ed*4;ef[eg+0]=(eh>>16)&255;ef[eg+1]=(eh>>8)&255;ef[eg+2]=eh&255;ef[eg+3]=(eh>>24)&255}eb.__isDirty=true}}(ea)}}var cG=function(ed,eg,ee){this.__isDirty=false;if(ed instanceof HTMLImageElement){this.fromHTMLImageData(ed)}else{if(eg||ee){this.width=ed||1;this.height=eg||1;var eb=this.sourceImg=d.createElement("canvas");eb.width=this.width;eb.height=this.height;var eh=this.imageData=eb.getContext("2d").createImageData(this.width,this.height);this.format=ee===2||ee===4?ee:1;if(this.format===1){for(var ec=3,ef=this.imageData.data,ea=ef.length;ec<ea;ec+=4){ef[ec]=255}}this.__isDirty=true;this.updatePixels()}else{this.width=0;this.height=0;this.imageData=cc.createImageData(1,1);this.format=2}}this.pixels=b0(this)};cG.prototype={__isPImage:true,updatePixels:function(){var ea=this.sourceImg;if(ea&&ea instanceof HTMLCanvasElement&&this.__isDirty){ea.getContext("2d").putImageData(this.imageData,0,0)}this.__isDirty=false},fromHTMLImageData:function(ea){var eb=by(ea);try{var ed=eb.context.getImageData(0,0,ea.width,ea.height);this.fromImageData(ed)}catch(ec){if(ea.width&&ea.height){this.isRemote=true;this.width=ea.width;this.height=ea.height}}this.sourceImg=ea},get:function(ea,ed,eb,ec){if(!arguments.length){return cW.get(this)}if(arguments.length===2){return cW.get(ea,ed,this)}if(arguments.length===4){return cW.get(ea,ed,eb,ec,this)}},set:function(ea,ec,eb){cW.set(ea,ec,eb,this);this.__isDirty=true},blend:function(ei,ee,ed,eb,eg,ej,eh,ef,ea,ec){if(arguments.length===9){cW.blend(this,ei,ee,ed,eb,eg,ej,eh,ef,ea,this)}else{if(arguments.length===10){cW.blend(ei,ee,ed,eb,eg,ej,eh,ef,ea,ec,this)}}delete this.sourceImg},copy:function(eh,ee,ed,ec,eb,ei,eg,ef,ea){if(arguments.length===8){cW.blend(this,eh,ee,ed,ec,eb,ei,eg,ef,0,this)}else{if(arguments.length===9){cW.blend(eh,ee,ed,ec,eb,ei,eg,ef,ea,0,this)}}delete this.sourceImg},filter:function(eb,ea){if(arguments.length===2){cW.filter(eb,ea,this)}else{if(arguments.length===1){cW.filter(eb,null,this)}}delete this.sourceImg},save:function(ea){cW.save(ea,this)},resize:function(ea,ec){if(this.isRemote){throw"Image is loaded remotely. Cannot resize."}if(this.width!==0||this.height!==0){if(ea===0&&ec!==0){ea=q.floor(this.width/this.height*ec)}else{if(ec===0&&ea!==0){ec=q.floor(this.height/this.width*ea)}}var eb=by(this.imageData).canvas;var ed=by(eb,ea,ec).context.getImageData(0,0,ea,ec);this.fromImageData(ed)}},mask:function(ea){var ed=this.toImageData(),ec,eb;if(ea instanceof cG||ea.__isPImage){if(ea.width===this.width&&ea.height===this.height){ea=ea.toImageData();for(ec=2,eb=this.width*this.height*4;ec<eb;ec+=4){ed.data[ec+1]=ea.data[ec]}}else{throw"mask must have the same dimensions as PImage."}}else{if(ea instanceof Array){if(this.width*this.height===ea.length){for(ec=0,eb=ea.length;ec<eb;++ec){ed.data[ec*4+3]=ea[ec]}}else{throw"mask array must be the same length as PImage pixels array."}}}this.fromImageData(ed)},loadPixels:G,toImageData:function(){if(this.isRemote){return this.sourceImg}if(!this.__isDirty){return this.imageData}var ea=by(this.sourceImg);return ea.context.getImageData(0,0,this.width,this.height)},toDataURL:function(){if(this.isRemote){throw"Image is loaded remotely. Cannot create dataURI."}var ea=by(this.imageData);return ea.canvas.toDataURL()},fromImageData:function(ee){var eb=ee.width,ed=ee.height,ec=d.createElement("canvas"),ea=ec.getContext("2d");this.width=ec.width=eb;this.height=ec.height=ed;ea.putImageData(ee,0,0);this.format=2;this.imageData=ee;this.sourceImg=ec}};cW.PImage=cG;cW.createImage=function(ea,eb,ec){return new cG(ea,eb,ec)};cW.loadImage=function(eb,ec,ee){if(ec){eb=eb+"."+ec}var ed;if(cQ.imageCache.images[eb]){ed=new cG(cQ.imageCache.images[eb]);ed.loaded=true;return ed}ed=new cG;var ea=d.createElement("img");ed.sourceImg=ea;ea.onload=function(ei,eg,ef){var ej=ei;var eh=eg;var ek=ef;return function(){eh.fromHTMLImageData(ej);eh.loaded=true;if(ek){ek()}}}(ea,ed,ee);ea.src=eb;return ed};cW.requestImage=cW.loadImage;function c9(ea,ed){var eb;if(ea>=cW.width||ea<0||ed<0||ed>=cW.height){return 0}if(dV){var ec=((0|ea)+cW.width*(0|ed))*4;eb=cW.imageData.data;return(eb[ec+3]&255)<<24|(eb[ec]&255)<<16|(eb[ec+1]&255)<<8|eb[ec+2]&255}eb=cW.toImageData(0|ea,0|ed,1,1).data;return(eb[3]&255)<<24|(eb[0]&255)<<16|(eb[1]&255)<<8|eb[2]&255}function c8(ea,ee,eb){if(eb.isRemote){throw"Image is loaded remotely. Cannot get x,y."}var ed=ee*eb.width*4+ea*4,ec=eb.imageData.data;return(ec[ed+3]&255)<<24|(ec[ed]&255)<<16|(ec[ed+1]&255)<<8|ec[ed+2]&255}function c6(ea,ee,eb,ec){var ed=new cG(eb,ec,2);ed.fromImageData(cW.toImageData(ea,ee,eb,ec));return ed}function c5(ef,ee,eg,el,er){if(er.isRemote){throw"Image is loaded remotely. Cannot get x,y,w,h."}var ep=new cG(eg,el,2),ec=ep.imageData.data,ed=er.width,em=er.height,eo=er.imageData.data;var ea=q.max(0,-ee),eb=q.max(0,-ef),eh=q.min(el,em-ee),ei=q.min(eg,ed-ef);for(var ek=ea;ek<eh;++ek){var en=((ee+ek)*ed+(ef+eb))*4;var eq=(ek*eg+eb)*4;for(var ej=eb;ej<ei;++ej){ec[eq++]=eo[en++];ec[eq++]=eo[en++];ec[eq++]=eo[en++];ec[eq++]=eo[en++]}}ep.__isDirty=true;return ep}cW.get=function(ea,ee,eb,ed,ec){if(ec!==undefined){return c5(ea,ee,eb,ed,ec)}if(ed!==undefined){return c6(ea,ee,eb,ed)}if(eb!==undefined){return c8(ea,ee,eb)}if(ee!==undefined){return c9(ea,ee)}if(ea!==undefined){return c5(0,0,ea.width,ea.height,ea)}return c6(0,0,cW.width,cW.height)};cW.createGraphics=function(ea,ec,eb){var ed=new F;ed.size(ea,ec,eb);ed.background(0,0);return ed};function T(){if(dV){d8=aj;dV=false;cW.updatePixels()}}function cq(){function eb(ef,ed){function ee(){T();d8[ed].apply(d8,arguments)}ef[ed]=ee}function ea(eg,ee){function ed(){T();return d8[ee]}function ef(eh){T();d8[ee]=eh}cW.defineProperty(eg,ee,{get:ed,set:ef})}for(var ec in d8){if(typeof d8[ec]==="function"){eb(this,ec)}else{ea(this,ec)}}}function cC(){if(dV){return}cW.loadPixels();if(cn===null){aj=d8;cn=new cq}dV=true;d8=cn;d3=0}function bx(ea,ec,eb){if(ea<cW.width&&ea>=0&&ec>=0&&ec<cW.height){cC();cW.pixels.setPixel((0|ea)+cW.width*(0|ec),eb);if(++d3>bZ){T()}}}function bv(ea,eg,ed,eb){if(eb.isRemote){throw"Image is loaded remotely. Cannot set x,y."}var ef=cW.color.toArray(ed);var ee=eg*eb.width*4+ea*4;var ec=eb.imageData.data;ec[ee]=ef[0];ec[ee+1]=ef[1];ec[ee+2]=ef[2];ec[ee+3]=ef[3]}cW.set=function(ea,ef,ed,ec){var eb,ee;if(arguments.length===3){if(typeof ed==="number"){bx(ea,ef,ed)}else{if(ed instanceof cG||ed.__isPImage){cW.image(ed,ea,ef)}}}else{if(arguments.length===4){bv(ea,ef,ed,ec)}}};cW.imageData={};cW.pixels={getLength:function(){return cW.imageData.data.length?cW.imageData.data.length/4:0},getPixel:function(ea){var ec=ea*4,eb=cW.imageData.data;return eb[ec+3]<<24&4278190080|eb[ec+0]<<16&16711680|eb[ec+1]<<8&65280|eb[ec+2]&255},setPixel:function(ea,ed){var ec=ea*4,eb=cW.imageData.data;eb[ec+0]=(ed&16711680)>>>16;eb[ec+1]=(ed&65280)>>>8;eb[ec+2]=ed&255;eb[ec+3]=(ed&4278190080)>>>24},toArray:function(){var ea=[],ec=cW.imageData.width*cW.imageData.height,ed=cW.imageData.data;for(var eb=0,ee=0;eb<ec;eb++,ee+=4){ea.push(ed[ee+3]<<24&4278190080|ed[ee+0]<<16&16711680|ed[ee+1]<<8&65280|ed[ee+2]&255)}return ea},set:function(ea){for(var eb=0,ec=ea.length;eb<ec;eb++){this.setPixel(eb,ea[eb])}}};cW.loadPixels=function(){cW.imageData=dY.$ensureContext().getImageData(0,0,cW.width,cW.height)};cW.updatePixels=function(){if(cW.imageData){dY.$ensureContext().putImageData(cW.imageData,0,0)}};cW.hint=function(eb){var ea=dY.$ensureContext();if(eb===4){ea.disable(ea.DEPTH_TEST);ea.depthMask(false);ea.clear(ea.DEPTH_BUFFER_BIT)}else{if(eb===-4){ea.enable(ea.DEPTH_TEST);ea.depthMask(true)}else{if(eb===-1||eb===2){dO=true}else{if(eb===1){dO=false}}}}};var bE=function(ed,ec,eb,ea){var ee;if(ed instanceof cG||ed.__isPImage){ee=ed;if(!ee.loaded){throw"Error using image in background(): PImage not loaded."}if(ee.width!==cW.width||ee.height!==cW.height){throw"Background image must be the same dimensions as the canvas."}}else{ee=cW.color(ed,ec,eb,ea)}a4=ee};bR.prototype.background=function(ed,ec,eb,ea){if(ed!==t){bE(ed,ec,eb,ea)}if(a4 instanceof cG||a4.__isPImage){aD();d8.setTransform(1,0,0,1,0,0);cW.image(a4,0,0);cP()}else{aD();d8.setTransform(1,0,0,1,0,0);if(cW.alpha(a4)!==bU){d8.clearRect(0,0,cW.width,cW.height)}d8.fillStyle=cW.color.toString(a4);d8.fillRect(0,0,cW.width,cW.height);aq=true;cP()}};bB.prototype.background=function(ed,ec,eb,ea){if(arguments.length>0){bE(ed,ec,eb,ea)}var ee=cW.color.toGLArray(a4);d8.clearColor(ee[0],ee[1],ee[2],ee[3]);d8.clear(d8.COLOR_BUFFER_BIT|d8.DEPTH_BUFFER_BIT)};bR.prototype.image=function(ed,ei,eg,ej,ee){ei=q.round(ei);eg=q.round(eg);if(ed.width>0){var ek=ej||ed.width;var eh=ee||ed.height;var ea=bk(ei||0,eg||0,ej||ed.width,ee||ed.height,arguments.length<4);var ef=!!ed.sourceImg&&bf===null;if(ef){var eb=ed.sourceImg;if(ed.__isDirty){ed.updatePixels()}d8.drawImage(eb,0,0,eb.width,eb.height,ea.x,ea.y,ea.w,ea.h)}else{var ec=ed.toImageData();if(bf!==null){bf(ec);ed.__isDirty=true}d8.drawImage(by(ec).canvas,0,0,ed.width,ed.height,ea.x,ea.y,ea.w,ea.h)}}};bB.prototype.image=function(ec,ea,ee,eb,ed){if(ec.width>0){ea=q.round(ea);ee=q.round(ee);eb=eb||ec.width;ed=ed||ec.height;cW.beginShape(cW.QUADS);cW.texture(ec);cW.vertex(ea,ee,0,0,0);cW.vertex(ea,ee+ed,0,0,ed);cW.vertex(ea+eb,ee+ed,0,eb,ed);cW.vertex(ea+eb,ee,0,eb,0);cW.endShape()}};cW.tint=function(ed,ec,ea,ei){var ef=cW.color(ed,ec,ea,ei);var eb=cW.red(ef)/bJ;var ee=cW.green(ef)/bI;var eg=cW.blue(ef)/bG;var eh=cW.alpha(ef)/bU;bf=function(em){var el=em.data,ek=4*em.width*em.height;for(var ej=0;ej<ek;){el[ej++]*=eb;el[ej++]*=ee;el[ej++]*=eg;el[ej++]*=eh}};bw=function(ek){for(var ej=0;ej<ek.length;){ek[ej++]=eb;ek[ej++]=ee;ek[ej++]=eg;ek[ej++]=eh}}};cW.noTint=function(){bf=null;bw=null};cW.copy=function(ea,ef,ee,eg,ec,ei,eh,eb,ed){if(ed===t){ed=eb;eb=eh;eh=ei;ei=ec;ec=eg;eg=ee;ee=ef;ef=ea;ea=cW}cW.blend(ea,ef,ee,eg,ec,ei,eh,eb,ed,0)};cW.blend=function(ea,ek,ej,en,ef,ep,eo,eb,eh,eg,ed){if(ea.isRemote){throw"Image is loaded remotely. Cannot blend image."}if(eg===t){eg=eh;eh=eb;eb=eo;eo=ep;ep=ef;ef=en;en=ej;ej=ek;ek=ea;ea=cW}var ec=ek+en,ei=ej+ef,em=ep+eb,ee=eo+eh,el=ed||cW;if(ed===t||eg===t){cW.loadPixels()}ea.loadPixels();if(ea===cW&&cW.intersect(ek,ej,ec,ei,ep,eo,em,ee)){cW.blit_resize(cW.get(ek,ej,ec-ek,ei-ej),0,0,ec-ek-1,ei-ej-1,el.imageData.data,el.width,el.height,ep,eo,em,ee,eg)}else{cW.blit_resize(ea,ek,ej,ec,ei,el.imageData.data,el.width,el.height,ep,eo,em,ee,eg)}if(ed===t){cW.updatePixels()}};var bp=function(ee){var ea=cW.floor(ee*3.5),ec,eb;ea=ea<1?1:ea<248?ea:248;if(cW.shared.blurRadius!==ea){cW.shared.blurRadius=ea;cW.shared.blurKernelSize=1+(cW.shared.blurRadius<<1);cW.shared.blurKernel=new e(cW.shared.blurKernelSize);var eg=cW.shared.blurKernel;var ef=cW.shared.blurKernelSize;var ed=cW.shared.blurRadius;for(ec=0;ec<ef;ec++){eg[ec]=0}var eh=(ea-1)*(ea-1);for(ec=1;ec<ea;ec++){eg[ea+ec]=eg[eb]=eh}eg[ea]=ea*ea}};var b7=function(eo,et){var ec,ef,el,eq,er,eA,es;var ev,en,ez,ey,ep;var ei=et.pixels.getLength();var eu=new e(ei);var eD=new e(ei);var eh=new e(ei);var eC=new e(ei);var eB=0;var ek,ej,ex,ee;bp(eo);var eb=et.height;var ea=et.width;var ew=cW.shared.blurKernelSize;var em=cW.shared.blurRadius;var eg=cW.shared.blurKernel;var ed=et.imageData.data;for(ej=0;ej<eb;ej++){for(ek=0;ek<ea;ek++){eq=el=ef=er=ec=0;ev=ek-em;if(ev<0){ep=-ev;ev=0}else{if(ev>=ea){break}ep=0}for(ex=ep;ex<ew;ex++){if(ev>=ea){break}ee=(ev+eB)*4;es=eg[ex];er+=es*ed[ee+3];ef+=es*ed[ee];el+=es*ed[ee+1];eq+=es*ed[ee+2];ec+=es;ev++}en=eB+ek;eC[en]=er/ec;eu[en]=ef/ec;eD[en]=el/ec;eh[en]=eq/ec}eB+=ea}eB=0;ez=-em;ey=ez*ea;for(ej=0;ej<eb;ej++){for(ek=0;ek<ea;ek++){eq=el=ef=er=ec=0;if(ez<0){ep=en=-ez;ev=ek}else{if(ez>=eb){break}ep=0;en=ez;ev=ek+ey}for(ex=ep;ex<ew;ex++){if(en>=eb){break}es=eg[ex];er+=es*eC[ev];ef+=es*eu[ev];el+=es*eD[ev];eq+=es*eh[ev];ec+=es;en++;ev+=ea}ee=(ek+eB)*4;ed[ee]=ef/ec;ed[ee+1]=el/ec;ed[ee+2]=eq/ec;ed[ee+3]=er/ec}eB+=ea;ey+=ea;ez++}};var cf=function(er,el){var eh=0;var ev=el.pixels.getLength();var em=new K(ev);var ep,eb,ek,ej,ed;var eq,ee,eg,ei,ec,en,eu,ea,es,ef,et,eo;if(!er){while(eh<ev){ep=eh;eb=eh+el.width;while(eh<eb){ek=ej=el.pixels.getPixel(eh);ee=eh-1;eq=eh+1;eg=eh-el.width;ei=eh+el.width;if(ee<ep){ee=eh}if(eq>=eb){eq=eh}if(eg<0){eg=0}if(ei>=ev){ei=eh}eu=el.pixels.getPixel(eg);en=el.pixels.getPixel(ee);ea=el.pixels.getPixel(ei);ec=el.pixels.getPixel(eq);ed=77*(ek>>16&255)+151*(ek>>8&255)+28*(ek&255);ef=77*(en>>16&255)+151*(en>>8&255)+28*(en&255);es=77*(ec>>16&255)+151*(ec>>8&255)+28*(ec&255);et=77*(eu>>16&255)+151*(eu>>8&255)+28*(eu&255);eo=77*(ea>>16&255)+151*(ea>>8&255)+28*(ea&255);if(ef>ed){ej=en;ed=ef}if(es>ed){ej=ec;ed=es}if(et>ed){ej=eu;ed=et}if(eo>ed){ej=ea;ed=eo}em[eh++]=ej}}}else{while(eh<ev){ep=eh;eb=eh+el.width;while(eh<eb){ek=ej=el.pixels.getPixel(eh);ee=eh-1;eq=eh+1;eg=eh-el.width;ei=eh+el.width;if(ee<ep){ee=eh}if(eq>=eb){eq=eh}if(eg<0){eg=0}if(ei>=ev){ei=eh}eu=el.pixels.getPixel(eg);en=el.pixels.getPixel(ee);ea=el.pixels.getPixel(ei);ec=el.pixels.getPixel(eq);ed=77*(ek>>16&255)+151*(ek>>8&255)+28*(ek&255);ef=77*(en>>16&255)+151*(en>>8&255)+28*(en&255);es=77*(ec>>16&255)+151*(ec>>8&255)+28*(ec&255);et=77*(eu>>16&255)+151*(eu>>8&255)+28*(eu&255);eo=77*(ea>>16&255)+151*(ea>>8&255)+28*(ea&255);if(ef<ed){ej=en;ed=ef}if(es<ed){ej=ec;ed=es}if(et<ed){ej=eu;ed=et}if(eo<ed){ej=ea;ed=eo}em[eh++]=ej}}}el.pixels.set(em)};cW.filter=function(eh,eg,ed){var ek,ef,eb,ej;if(arguments.length===3){ed.loadPixels();ek=ed}else{cW.loadPixels();ek=cW}if(eg===t){eg=null}if(ek.isRemote){throw"Image is loaded remotely. Cannot filter image."}var el=ek.pixels.getLength();switch(eh){case 11:var em=eg||1;b7(em,ek);break;case 12:if(ek.format===4){for(ej=0;ej<el;ej++){ef=255-ek.pixels.getPixel(ej);ek.pixels.setPixel(ej,4278190080|ef<<16|ef<<8|ef)}ek.format=1}else{for(ej=0;ej<el;ej++){ef=ek.pixels.getPixel(ej);eb=77*(ef>>16&255)+151*(ef>>8&255)+28*(ef&255)>>8;ek.pixels.setPixel(ej,ef&4278190080|eb<<16|eb<<8|eb)}}break;case 13:for(ej=0;ej<el;ej++){ek.pixels.setPixel(ej,ek.pixels.getPixel(ej)^16777215)}break;case 15:if(eg===null){throw"Use filter(POSTERIZE, int levels) instead of filter(POSTERIZE)"}var ep=cW.floor(eg);if(ep<2||ep>255){throw"Levels must be between 2 and 255 for filter(POSTERIZE, levels)"}var ei=ep-1;for(ej=0;ej<el;ej++){var ea=ek.pixels.getPixel(ej)>>16&255;var en=ek.pixels.getPixel(ej)>>8&255;var ec=ek.pixels.getPixel(ej)&255;ea=(ea*ep>>8)*255/ei;en=(en*ep>>8)*255/ei;ec=(ec*ep>>8)*255/ei;ek.pixels.setPixel(ej,4278190080&ek.pixels.getPixel(ej)|ea<<16|en<<8|ec)}break;case 14:for(ej=0;ej<el;ej++){ek.pixels.setPixel(ej,ek.pixels.getPixel(ej)|4278190080)}ek.format=1;break;case 16:if(eg===null){eg=0.5}if(eg<0||eg>1){throw"Level must be between 0 and 1 for filter(THRESHOLD, level)"}var ee=cW.floor(eg*255);for(ej=0;ej<el;ej++){var eo=cW.max((ek.pixels.getPixel(ej)&16711680)>>16,cW.max((ek.pixels.getPixel(ej)&65280)>>8,ek.pixels.getPixel(ej)&255));ek.pixels.setPixel(ej,ek.pixels.getPixel(ej)&4278190080|(eo<ee?0:16777215))}break;case 17:cf(true,ek);break;case 18:cf(false,ek);break}ek.updatePixels()};cW.shared={fracU:0,ifU:0,fracV:0,ifV:0,u1:0,u2:0,v1:0,v2:0,sX:0,sY:0,iw:0,iw1:0,ih1:0,ul:0,ll:0,ur:0,lr:0,cUL:0,cLL:0,cUR:0,cLR:0,srcXOffset:0,srcYOffset:0,r:0,g:0,b:0,a:0,srcBuffer:null,blurRadius:0,blurKernelSize:0,blurKernel:null};cW.intersect=function(ec,ej,eb,ei,en,eg,em,ef){var el=eb-ec+1;var ee=ei-ej+1;var ea=em-en+1;var eh=ef-eg+1;if(en<ec){ea+=en-ec;if(ea>el){ea=el}}else{var ek=el+ec-en;if(ea>ek){ea=ek}}if(eg<ej){eh+=eg-ej;if(eh>ee){eh=ee}}else{var ed=ee+ej-eg;if(eh>ed){eh=ed}}return !(ea<=0||eh<=0)};var dS={};dS[1]=cW.modes.blend;dS[2]=cW.modes.add;dS[4]=cW.modes.subtract;dS[8]=cW.modes.lightest;dS[16]=cW.modes.darkest;dS[0]=cW.modes.replace;dS[32]=cW.modes.difference;dS[64]=cW.modes.exclusion;dS[128]=cW.modes.multiply;dS[256]=cW.modes.screen;dS[512]=cW.modes.overlay;dS[1024]=cW.modes.hard_light;dS[2048]=cW.modes.soft_light;dS[4096]=cW.modes.dodge;dS[8192]=cW.modes.burn;cW.blit_resize=function(en,ez,et,ey,es,eE,ej,er,ex,eo,ew,em,ep){var eC,eB;if(ez<0){ez=0}if(et<0){et=0}if(ey>=en.width){ey=en.width-1}if(es>=en.height){es=en.height-1}var eI=ey-ez;var eN=es-et;var ea=ew-ex;var ek=em-eo;if(ea<=0||ek<=0||eI<=0||eN<=0||ex>=ej||eo>=er||ez>=en.width||et>=en.height){return}var eh=q.floor(eI/ea*32768);var ee=q.floor(eN/ek*32768);var eG=cW.shared;eG.srcXOffset=q.floor(ex<0?-ex*eh:ez*32768);eG.srcYOffset=q.floor(eo<0?-eo*ee:et*32768);if(ex<0){ea+=ex;ex=0}if(eo<0){ek+=eo;eo=0}ea=q.min(ea,ej-ex);ek=q.min(ek,er-eo);var eu=eo*ej+ex;var eQ;eG.srcBuffer=en.imageData.data;eG.iw=en.width;eG.iw1=en.width-1;eG.ih1=en.height-1;var ev=cW.filter_bilinear,eK=cW.filter_new_scanline,ei=dS[ep],eH,eM,eF,eJ,ec,ed,eb=4278190080,eL=16711680,eA=65280,eg=255,eP=32767,eD=15,el=1,eq=9,ef=eG.srcBuffer,eO=q.min;for(eB=0;eB<ek;eB++){eG.sX=eG.srcXOffset;eG.fracV=eG.srcYOffset&eP;eG.ifV=eP-eG.fracV;eG.v1=(eG.srcYOffset>>eD)*eG.iw;eG.v2=eO((eG.srcYOffset>>eD)+1,eG.ih1)*eG.iw;for(eC=0;eC<ea;eC++){eM=(eu+eC)*4;eQ=eE[eM+3]<<24&eb|eE[eM]<<16&eL|eE[eM+1]<<8&eA|eE[eM+2]&eg;eG.fracU=eG.sX&eP;eG.ifU=eP-eG.fracU;eG.ul=eG.ifU*eG.ifV>>eD;eG.ll=eG.ifU*eG.fracV>>eD;eG.ur=eG.fracU*eG.ifV>>eD;eG.lr=eG.fracU*eG.fracV>>eD;eG.u1=eG.sX>>eD;eG.u2=eO(eG.u1+1,eG.iw1);eF=(eG.v1+eG.u1)*4;eJ=(eG.v1+eG.u2)*4;ec=(eG.v2+eG.u1)*4;ed=(eG.v2+eG.u2)*4;eG.cUL=ef[eF+3]<<24&eb|ef[eF]<<16&eL|ef[eF+1]<<8&eA|ef[eF+2]&eg;eG.cUR=ef[eJ+3]<<24&eb|ef[eJ]<<16&eL|ef[eJ+1]<<8&eA|ef[eJ+2]&eg;eG.cLL=ef[ec+3]<<24&eb|ef[ec]<<16&eL|ef[ec+1]<<8&eA|ef[ec+2]&eg;eG.cLR=ef[ed+3]<<24&eb|ef[ed]<<16&eL|ef[ed+1]<<8&eA|ef[ed+2]&eg;eG.r=eG.ul*((eG.cUL&eL)>>16)+eG.ll*((eG.cLL&eL)>>16)+eG.ur*((eG.cUR&eL)>>16)+eG.lr*((eG.cLR&eL)>>16)<<el&eL;eG.g=eG.ul*(eG.cUL&eA)+eG.ll*(eG.cLL&eA)+eG.ur*(eG.cUR&eA)+eG.lr*(eG.cLR&eA)>>>eD&eA;eG.b=eG.ul*(eG.cUL&eg)+eG.ll*(eG.cLL&eg)+eG.ur*(eG.cUR&eg)+eG.lr*(eG.cLR&eg)>>>eD;eG.a=eG.ul*((eG.cUL&eb)>>>24)+eG.ll*((eG.cLL&eb)>>>24)+eG.ur*((eG.cUR&eb)>>>24)+eG.lr*((eG.cLR&eb)>>>24)<<eq&eb;eH=ei(eQ,eG.a|eG.r|eG.g|eG.b);eE[eM]=(eH&eL)>>>16;eE[eM+1]=(eH&eA)>>>8;eE[eM+2]=eH&eg;eE[eM+3]=(eH&eb)>>>24;eG.sX+=eh}eu+=ej;eG.srcYOffset+=ee}};cW.loadFont=function(eb,ec){if(eb===t){throw"font name required in loadFont."}if(eb.indexOf(".svg")===-1){if(ec===t){ec=W.size}return H.get(eb,ec)}var ea=cW.loadGlyphs(eb);return{name:eb,css:"12px sans-serif",glyph:true,units_per_em:ea.units_per_em,horiz_adv_x:1/ea.units_per_em*ea.horiz_adv_x,ascent:ea.ascent,descent:ea.descent,width:function(eh){var ef=0;var ed=eh.length;for(var ee=0;ee<ed;ee++){try{ef+=parseFloat(cW.glyphLook(cW.glyphTable[eb],eh[ee]).horiz_adv_x)}catch(eg){F.debug(eg)}}return ef/cW.glyphTable[eb].units_per_em}}};cW.createFont=function(ea,eb){return cW.loadFont(ea,eb)};cW.textFont=function(ea,ec){if(ec!==t){if(!ea.glyph){ea=H.get(ea.name,ec)}d0=ec}W=ea;Y=W.name;a3=W.ascent;dA=W.descent;d7=W.leading;var eb=dY.$ensureContext();eb.font=W.css};cW.textSize=function(eb){W=H.get(Y,eb);d0=eb;a3=W.ascent;dA=W.descent;d7=W.leading;var ea=dY.$ensureContext();ea.font=W.css};cW.textAscent=function(){return a3};cW.textDescent=function(){return dA};cW.textLeading=function(ea){d7=ea};cW.textAlign=function(eb,ea){N=eb;c1=ea||0};function bu(ea){if(ea instanceof String){return ea}if(typeof ea==="number"){if(ea===(0|ea)){return ea.toString()}return cW.nf(ea,0,3)}if(ea===null||ea===t){return""}return ea.toString()}bR.prototype.textWidth=function(ee){var ea=bu(ee).split(/\r?\n/g),ec=0;var eb,ed=ea.length;d8.font=W.css;for(eb=0;eb<ed;++eb){ec=q.max(ec,W.measureTextWidth(ea[eb]))}return ec|0};bB.prototype.textWidth=function(ef){var ea=bu(ef).split(/\r?\n/g),ed=0;var ec,ee=ea.length;if(cE===t){cE=d.createElement("canvas")}var eb=cE.getContext("2d");eb.font=W.css;for(ec=0;ec<ee;++ec){ed=q.max(ed,eb.measureText(ea[ec]).width)}return ed|0};cW.glyphLook=function(ea,eb){try{switch(eb){case"1":return ea.one;case"2":return ea.two;case"3":return ea.three;case"4":return ea.four;case"5":return ea.five;case"6":return ea.six;case"7":return ea.seven;case"8":return ea.eight;case"9":return ea.nine;case"0":return ea.zero;case" ":return ea.space;case"$":return ea.dollar;case"!":return ea.exclam;case'"':return ea.quotedbl;case"#":return ea.numbersign;case"%":return ea.percent;case"&":return ea.ampersand;case"'":return ea.quotesingle;case"(":return ea.parenleft;case")":return ea.parenright;case"*":return ea.asterisk;case"+":return ea.plus;case",":return ea.comma;case"-":return ea.hyphen;case".":return ea.period;case"/":return ea.slash;case"_":return ea.underscore;case":":return ea.colon;case";":return ea.semicolon;case"<":return ea.less;case"=":return ea.equal;case">":return ea.greater;case"?":return ea.question;case"@":return ea.at;case"[":return ea.bracketleft;case"\\":return ea.backslash;case"]":return ea.bracketright;case"^":return ea.asciicircum;case"`":return ea.grave;case"{":return ea.braceleft;case"|":return ea.bar;case"}":return ea.braceright;case"~":return ea.asciitilde;default:return ea[eb]}}catch(ec){F.debug(ec)}};bR.prototype.text$line=function(ei,el,ek,ej,ef){var eh=0,eg=0;if(!W.glyph){if(ei&&"fillText" in d8){if(aq){d8.fillStyle=cW.color.toString(a1);aq=false}if(ef===39||ef===3){eh=W.measureTextWidth(ei);if(ef===39){eg=-eh}else{eg=-eh/2}}d8.fillText(ei,el+eg,ek)}}else{var ea=cW.glyphTable[Y];aD();d8.translate(el,ek+d0);if(ef===39||ef===3){eh=ea.width(ei);if(ef===39){eg=-eh}else{eg=-eh/2}}var em=ea.units_per_em,ee=1/em*d0;d8.scale(ee,ee);for(var eb=0,ec=ei.length;eb<ec;eb++){try{cW.glyphLook(ea,ei[eb]).draw()}catch(ed){F.debug(ed)}}cP()}};bB.prototype.text$line=function(eh,el,ek,ei,ef){if(cE===t){cE=d.createElement("canvas")}var eb=d8;d8=cE.getContext("2d");d8.font=W.css;var eg=W.measureTextWidth(eh);cE.width=eg;cE.height=d0;d8=cE.getContext("2d");d8.font=W.css;d8.textBaseline="top";bR.prototype.text$line(eh,0,0,0,37);var ea=cE.width/cE.height;d8=eb;d8.bindTexture(d8.TEXTURE_2D,bS);d8.texImage2D(d8.TEXTURE_2D,0,d8.RGBA,d8.RGBA,d8.UNSIGNED_BYTE,cE);d8.texParameteri(d8.TEXTURE_2D,d8.TEXTURE_MAG_FILTER,d8.LINEAR);d8.texParameteri(d8.TEXTURE_2D,d8.TEXTURE_MIN_FILTER,d8.LINEAR);d8.texParameteri(d8.TEXTURE_2D,d8.TEXTURE_WRAP_T,d8.CLAMP_TO_EDGE);d8.texParameteri(d8.TEXTURE_2D,d8.TEXTURE_WRAP_S,d8.CLAMP_TO_EDGE);var ee=0;if(ef===39){ee=-eg}else{if(ef===3){ee=-eg/2}}var ec=new aP;var ed=d0*0.5;ec.translate(el+ee-ed/2,ek-ed,ei);ec.scale(-ea*ed,-ed,ed);ec.translate(-1,-1,-1);ec.transpose();var ej=new aP;ej.scale(1,-1,1);ej.apply(dJ.array());ej.transpose();d8.useProgram(dQ);dc("aVertex2d",dQ,"aVertex",3,cH);dc("aTextureCoord2d",dQ,"aTextureCoord",2,ac);dZ("uSampler2d",dQ,"uSampler",[0]);dZ("uIsDrawingText2d",dQ,"uIsDrawingText",true);a9("uModel2d",dQ,"uModel",false,ec.array());a9("uView2d",dQ,"uView",false,ej.array());d2("uColor2d",dQ,"uColor",bo);d8.bindBuffer(d8.ELEMENT_ARRAY_BUFFER,R);d8.drawElements(d8.TRIANGLES,6,d8.UNSIGNED_SHORT,0)};function bi(ed,eg,ef,ee){var ei,ec;if(ed.indexOf("\n")<0){ei=[ed];ec=1}else{ei=ed.split(/\r?\n/g);ec=ei.length}var ea=0;if(c1===101){ea=a3+dA}else{if(c1===3){ea=a3/2-(ec-1)*d7/2}else{if(c1===102){ea=-(dA+(ec-1)*d7)}}}for(var eb=0;eb<ec;++eb){var eh=ei[eb];dY.text$line(eh,eg,ef+ea,ee,N);ea+=d7}}function bd(eq,el,ek,ep,en,ej){if(eq.length===0||ep===0||en===0){return}if(d0>en){return}var em=-1;var ee=0;var ea=0;var eg=[];for(var ef=0,es=eq.length;ef<es;ef++){var eh=eq[ef];var ev=eh===" ";var eo=W.measureTextWidth(eh);if(eh!=="\n"&&ea+eo<=ep){if(ev){em=ef}ea+=eo}else{if(em+1===ee){if(ef>0){em=ef}else{return}}if(eh==="\n"){eg.push({text:eq.substring(ee,ef),width:ea});ee=ef+1}else{eg.push({text:eq.substring(ee,em+1),width:ea});ee=em+1}ea=0;ef=ee-1}}if(ee<es){eg.push({text:eq.substring(ee),width:ea})}var eu=1,ei=a3;if(N===3){eu=ep/2}else{if(N===39){eu=ep}}var er=eg.length,eb=q.min(er,q.floor(en/d7));if(c1===101){ei=a3+dA}else{if(c1===3){ei=en/2-d7*(eb/2-1)}else{if(c1===102){ei=dA+d7}}}var ec,ed,et;for(ec=0;ec<er;ec++){et=ec*d7;if(ei+et>en-dA){break}ed=eg[ec];dY.text$line(ed.text,el+eu,ek+ei+et,ej,N)}}cW.text=function(){if(cI===5){return}if(arguments.length===3){bi(bu(arguments[0]),arguments[1],arguments[2],0)}else{if(arguments.length===4){bi(bu(arguments[0]),arguments[1],arguments[2],arguments[3])}else{if(arguments.length===5){bd(bu(arguments[0]),arguments[1],arguments[2],arguments[3],arguments[4],0)}else{if(arguments.length===6){bd(bu(arguments[0]),arguments[1],arguments[2],arguments[3],arguments[4],arguments[5])}}}}};cW.textMode=function(ea){cI=ea};cW.loadGlyphs=function(eg){var ei,eh,ee,ec,ep,eo,en,eq,ek,er,el,em="[0-9\\-]+",ej;var ef=function(ex,ew){var eu=0,et=[],es,ev=new RegExp(ex,"g");es=et[eu]=ev.exec(ew);while(es){eu++;es=et[eu]=ev.exec(ew)}return et};var eb=function(ex){var ey=ef("[A-Za-z][0-9\\- ]+|Z",ex);var ew=function(){aD();return dY.$ensureContext()};var eu=function(){bn();dd();cP()};ej="return {draw:function(){var curContext=beforePathDraw();curContext.beginPath();";ei=0;eh=0;ee=0;ec=0;ep=0;eo=0;ex=0;eq=0;ek="";er=ey.length-1;for(var et=0;et<er;et++){var es=ey[et][0],ev=ef(em,es);switch(es[0]){case"M":ei=parseFloat(ev[0][0]);eh=parseFloat(ev[1][0]);ej+="curContext.moveTo("+ei+","+-eh+");";break;case"L":ei=parseFloat(ev[0][0]);eh=parseFloat(ev[1][0]);ej+="curContext.lineTo("+ei+","+-eh+");";break;case"H":ei=parseFloat(ev[0][0]);ej+="curContext.lineTo("+ei+","+-eh+");";break;case"V":eh=parseFloat(ev[0][0]);ej+="curContext.lineTo("+ei+","+-eh+");";break;case"T":ep=parseFloat(ev[0][0]);eo=parseFloat(ev[1][0]);if(ek==="Q"||ek==="T"){ex=q.sqrt(q.pow(ei-ee,2)+q.pow(ec-eh,2));eq=q.PI+q.atan2(ee-ei,ec-eh);ee=ei+q.sin(eq)*ex;ec=eh+q.cos(eq)*ex}else{ee=ei;ec=eh}ej+="curContext.quadraticCurveTo("+ee+","+-ec+","+ep+","+-eo+");";ei=ep;eh=eo;break;case"Q":ee=parseFloat(ev[0][0]);ec=parseFloat(ev[1][0]);ep=parseFloat(ev[2][0]);eo=parseFloat(ev[3][0]);ej+="curContext.quadraticCurveTo("+ee+","+-ec+","+ep+","+-eo+");";ei=ep;eh=eo;break;case"Z":ej+="curContext.closePath();";break}ek=es[0]}ej+="afterPathDraw();";ej+="curContext.translate("+el+",0);";ej+="}}";return(new Function("beforePathDraw","afterPathDraw",ej))(ew,eu)};var ea=function(ev){var eu=ev.getElementsByTagName("font");cW.glyphTable[eg].horiz_adv_x=eu[0].getAttribute("horiz-adv-x");var ex=ev.getElementsByTagName("font-face")[0];cW.glyphTable[eg].units_per_em=parseFloat(ex.getAttribute("units-per-em"));cW.glyphTable[eg].ascent=parseFloat(ex.getAttribute("ascent"));cW.glyphTable[eg].descent=parseFloat(ex.getAttribute("descent"));var ez=ev.getElementsByTagName("glyph"),et=ez.length;for(var ey=0;ey<et;ey++){var es=ez[ey].getAttribute("unicode");var ew=ez[ey].getAttribute("glyph-name");el=ez[ey].getAttribute("horiz-adv-x");if(el===null){el=cW.glyphTable[eg].horiz_adv_x}en=ez[ey].getAttribute("d");if(en!==t){ej=eb(en);cW.glyphTable[eg][ew]={name:ew,unicode:es,horiz_adv_x:el,draw:ej.draw}}}};var ed=function(){var eu;try{eu=d.implementation.createDocument("","",null)}catch(ew){F.debug(ew.message);return}try{eu.async=false;eu.load(eg);ea(eu.getElementsByTagName("svg")[0])}catch(et){F.debug(et);try{var es=new D.XMLHttpRequest;es.open("GET",eg,false);es.send(null);ea(es.responseXML.documentElement)}catch(ev){F.debug(et)}}};cW.glyphTable[eg]={};ed(eg);return cW.glyphTable[eg]};cW.param=function(ec){var eb="data-processing-"+ec;if(ae.hasAttribute(eb)){return ae.getAttribute(eb)}for(var ed=0,ea=ae.childNodes.length;ed<ea;++ed){var ee=ae.childNodes.item(ed);if(ee.nodeType!==1||ee.tagName.toLowerCase()!=="param"){continue}if(ee.getAttribute("name")===ec){return ee.getAttribute("value")}}if(cQ.params.hasOwnProperty(ec)){return cQ.params[ec]}return null};function cL(eb){if(eb==="3D"){dY=new bB}else{if(eb==="2D"){dY=new bR}else{dY=new ca}}for(var ea in ca.prototype){if(ca.prototype.hasOwnProperty(ea)&&ea.indexOf("$")<0){cW[ea]=dY[ea]}}dY.$init()}function cU(ea){return function(){cL("2D");return dY[ea].apply(this,arguments)}}ca.prototype.translate=cU("translate");ca.prototype.transform=cU("transform");ca.prototype.scale=cU("scale");ca.prototype.pushMatrix=cU("pushMatrix");ca.prototype.popMatrix=cU("popMatrix");ca.prototype.resetMatrix=cU("resetMatrix");ca.prototype.applyMatrix=cU("applyMatrix");ca.prototype.rotate=cU("rotate");ca.prototype.rotateZ=cU("rotateZ");ca.prototype.shearX=cU("shearX");ca.prototype.shearY=cU("shearY");ca.prototype.redraw=cU("redraw");ca.prototype.toImageData=cU("toImageData");ca.prototype.ambientLight=cU("ambientLight");ca.prototype.directionalLight=cU("directionalLight");ca.prototype.lightFalloff=cU("lightFalloff");ca.prototype.lightSpecular=cU("lightSpecular");ca.prototype.pointLight=cU("pointLight");ca.prototype.noLights=cU("noLights");ca.prototype.spotLight=cU("spotLight");ca.prototype.beginCamera=cU("beginCamera");ca.prototype.endCamera=cU("endCamera");ca.prototype.frustum=cU("frustum");ca.prototype.box=cU("box");ca.prototype.sphere=cU("sphere");ca.prototype.ambient=cU("ambient");ca.prototype.emissive=cU("emissive");ca.prototype.shininess=cU("shininess");ca.prototype.specular=cU("specular");ca.prototype.fill=cU("fill");ca.prototype.stroke=cU("stroke");ca.prototype.strokeWeight=cU("strokeWeight");ca.prototype.smooth=cU("smooth");ca.prototype.noSmooth=cU("noSmooth");ca.prototype.point=cU("point");ca.prototype.vertex=cU("vertex");ca.prototype.endShape=cU("endShape");ca.prototype.bezierVertex=cU("bezierVertex");ca.prototype.curveVertex=cU("curveVertex");ca.prototype.curve=cU("curve");ca.prototype.line=cU("line");ca.prototype.bezier=cU("bezier");ca.prototype.rect=cU("rect");ca.prototype.ellipse=cU("ellipse");ca.prototype.background=cU("background");ca.prototype.image=cU("image");ca.prototype.textWidth=cU("textWidth");ca.prototype.text$line=cU("text$line");ca.prototype.$ensureContext=cU("$ensureContext");ca.prototype.$newPMatrix=cU("$newPMatrix");ca.prototype.size=function(ea,ec,eb){cL(eb===2?"3D":"2D");cW.size(ea,ec,eb)};ca.prototype.$init=G;bR.prototype.$init=function(){cW.size(cW.width,cW.height);d8.lineCap="round";cW.noSmooth();cW.disableContextMenu()};bB.prototype.$init=function(){cW.use3DContext=true;cW.disableContextMenu()};ds.prototype.$ensureContext=function(){return d8};function dy(eb,ed){var ec=eb,ea=0,ee=0;cW.pmouseX=cW.mouseX;cW.pmouseY=cW.mouseY;if(ec.offsetParent){do{ea+=ec.offsetLeft;ee+=ec.offsetTop}while(!!(ec=ec.offsetParent))}ec=eb;do{ea-=ec.scrollLeft||0;ee-=ec.scrollTop||0}while(!!(ec=ec.parentNode));ea+=ad;ee+=dp;ea+=aU;ee+=bX;ea+=D.pageXOffset;ee+=D.pageYOffset;return{X:ea,Y:ee}}function aI(ea,eb){var ec=dy(ea,eb);cW.mouseX=eb.pageX-ec.X;cW.mouseY=eb.pageY-ec.Y}function cu(eb){var ed=dy(eb.changedTouches[0].target,eb.changedTouches[0]),ea;for(ea=0;ea<eb.touches.length;ea++){var ef=eb.touches[ea];ef.offsetX=ef.pageX-ed.X;ef.offsetY=ef.pageY-ed.Y}for(ea=0;ea<eb.targetTouches.length;ea++){var ec=eb.targetTouches[ea];ec.offsetX=ec.pageX-ed.X;ec.offsetY=ec.pageY-ed.Y}for(ea=0;ea<eb.changedTouches.length;ea++){var ee=eb.changedTouches[ea];ee.offsetX=ee.pageX-ed.X;ee.offsetY=ee.pageY-ed.Y}return eb}bO(ae,"touchstart",function(ec){ae.setAttribute("style","-webkit-user-select: none");ae.setAttribute("onclick","void(0)");ae.setAttribute("style","-webkit-tap-highlight-color:rgba(0,0,0,0)");for(var eb=0,ea=au.length;eb<ea;eb++){var ed=au[eb].type;if(ed==="mouseout"||ed==="mousemove"||ed==="mousedown"||ed==="mouseup"||ed==="DOMMouseScroll"||ed==="mousewheel"||ed==="touchstart"){de(au[eb])}}if(cW.touchStart!==t||cW.touchMove!==t||cW.touchEnd!==t||cW.touchCancel!==t){bO(ae,"touchstart",function(ee){if(cW.touchStart!==t){ee=cu(ee);cW.touchStart(ee)}});bO(ae,"touchmove",function(ee){if(cW.touchMove!==t){ee.preventDefault();ee=cu(ee);cW.touchMove(ee)}});bO(ae,"touchend",function(ee){if(cW.touchEnd!==t){ee=cu(ee);cW.touchEnd(ee)}});bO(ae,"touchcancel",function(ee){if(cW.touchCancel!==t){ee=cu(ee);cW.touchCancel(ee)}})}else{bO(ae,"touchstart",function(ee){aI(ae,ee.touches[0]);cW.__mousePressed=true;cW.mouseDragging=false;cW.mouseButton=37;if(typeof cW.mousePressed==="function"){cW.mousePressed()}});bO(ae,"touchmove",function(ee){ee.preventDefault();aI(ae,ee.touches[0]);if(typeof cW.mouseMoved==="function"&&!cW.__mousePressed){cW.mouseMoved()}if(typeof cW.mouseDragged==="function"&&cW.__mousePressed){cW.mouseDragged();cW.mouseDragging=true}});bO(ae,"touchend",function(ee){cW.__mousePressed=false;if(typeof cW.mouseClicked==="function"&&!cW.mouseDragging){cW.mouseClicked()}if(typeof cW.mouseReleased==="function"){cW.mouseReleased()}})}ae.dispatchEvent(ec)});(function(){var ea=true,eb=function(ec){ec.preventDefault();ec.stopPropagation()};cW.disableContextMenu=function(){if(!ea){return}bO(ae,"contextmenu",eb);ea=false};cW.enableContextMenu=function(){if(ea){return}de({elem:ae,type:"contextmenu",fn:eb});ea=true}})();bO(ae,"mousemove",function(ea){aI(ae,ea);if(typeof cW.mouseMoved==="function"&&!cW.__mousePressed){cW.mouseMoved()}if(typeof cW.mouseDragged==="function"&&cW.__mousePressed){cW.mouseDragged();cW.mouseDragging=true}});bO(ae,"mouseout",function(ea){if(typeof cW.mouseOut==="function"){cW.mouseOut()}});bO(ae,"mouseover",function(ea){aI(ae,ea);if(typeof cW.mouseOver==="function"){cW.mouseOver()}});ae.onmousedown=function(){ae.focus();return false};bO(ae,"mousedown",function(ea){cW.__mousePressed=true;cW.mouseDragging=false;switch(ea.which){case 1:cW.mouseButton=37;break;case 2:cW.mouseButton=3;break;case 3:cW.mouseButton=39;break}if(typeof cW.mousePressed==="function"){cW.mousePressed()}});bO(ae,"mouseup",function(ea){cW.__mousePressed=false;if(typeof cW.mouseClicked==="function"&&!cW.mouseDragging){cW.mouseClicked()}if(typeof cW.mouseReleased==="function"){cW.mouseReleased()}});var an=function(ea){var eb=0;if(ea.wheelDelta){eb=ea.wheelDelta/120;if(D.opera){eb=-eb}}else{if(ea.detail){eb=-ea.detail/3}}cW.mouseScroll=eb;if(eb&&typeof cW.mouseScrolled==="function"){cW.mouseScrolled()}};bO(d,"DOMMouseScroll",an);bO(d,"mousewheel",an);if(!ae.getAttribute("tabindex")){ae.setAttribute("tabindex",0)}function dD(eb){var ea=eb.which||eb.keyCode;switch(ea){case 13:return 10;case 91:case 93:case 224:return 157;case 57392:return 17;case 46:return 127;case 45:return 155}return ea}function cB(eb){var ec=eb.which||eb.keyCode;var ea=eb.shiftKey||eb.ctrlKey||eb.altKey||eb.metaKey;switch(ec){case 13:ec=ea?13:10;break;case 8:ec=ea?127:8;break}return new bP(ec)}function cR(ea){if(typeof ea.preventDefault==="function"){ea.preventDefault()}else{if(typeof ea.stopPropagation==="function"){ea.stopPropagation()}}return false}function dG(){var ea;for(ea in ag){if(ag.hasOwnProperty(ea)){cW.__keyPressed=true;return}}cW.__keyPressed=false}function cx(){cW.__keyPressed=false;ag=[];dI=null}function bq(ea,eb){ag[ea]=eb;dI=null;cW.key=eb;cW.keyCode=ea;cW.keyPressed();cW.keyCode=0;cW.keyTyped();dG()}function cz(eb){var ea=dD(eb);if(ea===127){bq(ea,new bP(127));return}if(dX.indexOf(ea)<0){dI=ea;return}var ec=new bP(65535);cW.key=ec;cW.keyCode=ea;ag[ea]=ec;cW.keyPressed();dI=null;dG();return cR(eb)}function dv(eb){if(dI===null){return}var ea=dI,ec=cB(eb);bq(ea,ec);return cR(eb)}function cp(eb){var ea=dD(eb),ec=ag[ea];if(ec===t){return}cW.key=ec;cW.keyCode=ea;cW.keyReleased();delete ag[ea];dG()}if(!cV){if(ba instanceof F.Sketch){cQ=ba}else{if(typeof ba==="function"){cQ=new F.Sketch(ba)}else{if(!ba){cQ=new F.Sketch(function(){})}else{cQ=F.compile(ba)}}}cW.externals.sketch=cQ;cL();ae.onfocus=function(){cW.focused=true};ae.onblur=function(){cW.focused=false;if(!cQ.options.globalKeyEvents){cx()}};if(cQ.options.pauseOnBlur){bO(D,"focus",function(){if(aC){cW.loop()}});bO(D,"blur",function(){if(aC&&ax){cW.noLoop();aC=true}cx()})}var aV=cQ.options.globalKeyEvents?D:ae;bO(aV,"keydown",cz);bO(aV,"keypress",dv);bO(aV,"keyup",cp);for(var c4 in F.lib){if(F.lib.hasOwnProperty(c4)){if(F.lib[c4].hasOwnProperty("attach")){F.lib[c4].attach(cW)}else{if(F.lib[c4] instanceof Function){F.lib[c4].call(this)}}}}var dB=100;var b6=function(ed){if(!(cQ.imageCache.pending||H.preloading.pending(dB))){if(D.opera){var ec,eb,ea=cQ.imageCache.operaCache;for(ec in ea){if(ea.hasOwnProperty(ec)){eb=ea[ec];if(eb!==null){d.body.removeChild(eb)}delete ea[ec]}}}cQ.attach(ed,g);cQ.onLoad(ed);if(ed.setup){ed.setup();ed.resetMatrix();cQ.onSetup()}T();if(ed.draw){if(!aC){ed.redraw()}else{ed.loop()}}}else{D.setTimeout(function(){b6(ed)},dB)}};a(this);b6(cW)}else{cQ=new F.Sketch;cL();cW.size=function(ea,ec,eb){if(eb&&eb===2){cL("3D")}else{cL("2D")}cW.size(ea,ec,eb)}}};F.debug=s;F.prototype=g;function u(){var R=["abs","acos","alpha","ambient","ambientLight","append","applyMatrix","arc","arrayCopy","asin","atan","atan2","background","beginCamera","beginDraw","beginShape","bezier","bezierDetail","bezierPoint","bezierTangent","bezierVertex","binary","blend","blendColor","blit_resize","blue","box","breakShape","brightness","camera","ceil","Character","color","colorMode","concat","constrain","copy","cos","createFont","createGraphics","createImage","cursor","curve","curveDetail","curvePoint","curveTangent","curveTightness","curveVertex","day","degrees","directionalLight","disableContextMenu","dist","draw","ellipse","ellipseMode","emissive","enableContextMenu","endCamera","endDraw","endShape","exit","exp","expand","externals","fill","filter","floor","focused","frameCount","frameRate","frustum","get","glyphLook","glyphTable","green","height","hex","hint","hour","hue","image","imageMode","intersect","join","key","keyCode","keyPressed","keyReleased","keyTyped","lerp","lerpColor","lightFalloff","lights","lightSpecular","line","link","loadBytes","loadFont","loadGlyphs","loadImage","loadPixels","loadShape","loadXML","loadStrings","log","loop","mag","map","match","matchAll","max","millis","min","minute","mix","modelX","modelY","modelZ","modes","month","mouseButton","mouseClicked","mouseDragged","mouseMoved","mouseOut","mouseOver","mousePressed","mouseReleased","mouseScroll","mouseScrolled","mouseX","mouseY","name","nf","nfc","nfp","nfs","noCursor","noFill","noise","noiseDetail","noiseSeed","noLights","noLoop","norm","normal","noSmooth","noStroke","noTint","ortho","param","parseBoolean","parseByte","parseChar","parseFloat","parseInt","peg","perspective","PImage","pixels","PMatrix2D","PMatrix3D","PMatrixStack","pmouseX","pmouseY","point","pointLight","popMatrix","popStyle","pow","print","printCamera","println","printMatrix","printProjection","PShape","PShapeSVG","pushMatrix","pushStyle","quad","radians","random","Random","randomSeed","rect","rectMode","red","redraw","requestImage","resetMatrix","reverse","rotate","rotateX","rotateY","rotateZ","round","saturation","save","saveFrame","saveStrings","scale","screenX","screenY","screenZ","second","set","setup","shape","shapeMode","shared","shearX","shearY","shininess","shorten","sin","size","smooth","sort","specular","sphere","sphereDetail","splice","split","splitTokens","spotLight","sq","sqrt","status","str","stroke","strokeCap","strokeJoin","strokeWeight","subset","tan","text","textAlign","textAscent","textDescent","textFont","textLeading","textMode","textSize","texture","textureMode","textWidth","tint","toImageData","touchCancel","touchEnd","touchMove","touchStart","translate","transform","triangle","trim","unbinary","unhex","updatePixels","use3DContext","vertex","width","XMLElement","XML","year","__contains","__equals","__equalsIgnoreCase","__frameRate","__hashCode","__int_cast","__instanceof","__keyPressed","__mousePressed","__printStackTrace","__replace","__replaceAll","__replaceFirst","__toCharArray","__split","__codePointAt","__startsWith","__endsWith","__matches"];var P={};var Q,O;for(Q=0,O=R.length;Q<O;++Q){P[R[Q]]=null}for(var S in F.lib){if(F.lib.hasOwnProperty(S)){if(F.lib[S].exports){var N=F.lib[S].exports;for(Q=0,O=N.length;Q<O;++Q){P[N[Q]]=null}}}}return P}function c(ar){var aX=u();function aE(bq){var bt=[];var bv=bq.split(/([\{\[\(\)\]\}])/);var by=bv[0];var bw=[];for(var bs=1;bs<bv.length;bs+=2){var bx=bv[bs];if(bx==="["||bx==="{"||bx==="("){bw.push(by);by=bx}else{if(bx==="]"||bx==="}"||bx===")"){var br=bx==="}"?"A":bx===")"?"B":"C";var bu=bt.length;bt.push(by+bx);by=bw.pop()+'"'+br+(bu+1)+'"'}}by+=bv[bs+1]}bt.unshift(by);return bt}function aj(br,bq){return br.replace(/'(\d+)'/g,function(bt,bs){var bu=bq[bs];if(bu.charAt(0)==="/"){return bu}return/^'((?:[^'\\\n])|(?:\\.[0-9A-Fa-f]*))'$/.test(bu)?"(new $p.Character("+bu+"))":bu})}function aP(bt){var bs=/^\s*/.exec(bt),bq;if(bs[0].length===bt.length){bq={left:bs[0],middle:"",right:""}}else{var br=/\s*$/.exec(bt);bq={left:bs[0],middle:bt.substring(bs[0].length,br.index),right:br[0]}}bq.untrim=function(bu){return this.left+bu+this.right};return bq}function a6(bq){return bq.replace(/^\s+/,"").replace(/\s+$/,"")}function av(bs,bt){for(var br=0,bq=bt.length;br<bq;++br){bs[bt[br]]=null}return bs}function ba(br){for(var bq in br){if(br.hasOwnProperty(bq)){return false}}return true}function aQ(bq){return bq.substring(2,bq.length-1)}var bg=ar.replace(/\r\n?|\n\r/g,"\n");var N=[];var a3=bg.replace(/("(?:[^"\\\n]|\\.)*")|('(?:[^'\\\n]|\\.)*')|(([\[\(=|&!\^:?]\s*)(\/(?![*\/])(?:[^\/\\\n]|\\.)*\/[gim]*)\b)|(\/\/[^\n]*\n)|(\/\*(?:(?!\*\/)(?:.|\n))*\*\/)/g,function(by,br,bv,bw,bt,bx,bq,bs){var bu;if(br||bv){bu=N.length;N.push(by);return"'"+bu+"'"}if(bw){bu=N.length;N.push(bx);return bt+"'"+bu+"'"}return bs!==""?" ":"\n"});a3=a3.replace(/__x([0-9A-F]{4})/g,function(br,bq){return"__x005F_x"+bq});a3=a3.replace(/\$/g,"__x0024");var Z;var aA=a3;var aa=function(br,bs,bq,bt){if(!!bs||!!bt){return br}Z=true;return""};do{Z=false;aA=aA.replace(/([<]?)<\s*((?:\?|[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\[\])*(?:\s+(?:extends|super)\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)?(?:\s*,\s*(?:\?|[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\[\])*(?:\s+(?:extends|super)\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)?)*)\s*>([=]?)/g,aa)}while(Z);var bk=aE(aA);var al;var aJ={},a9,az=0;function bc(br,bq){var bs=bk.length;bk.push(br);return'"'+bq+bs+'"'}function a7(){return"class"+ ++az}function bl(br,bs,bq){br.classId=bs;br.scopeId=bq;aJ[bs]=br}var V,S,ap,aV,bi,aZ;var O=/\b((?:(?:public|private|final|protected|static|abstract)\s+)*)(class|interface)\s+([A-Za-z_$][\w$]*\b)(\s+extends\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\b)*)?(\s+implements\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\b)*)?\s*("A\d+")/g;var bb=/\b((?:(?:public|private|final|protected|static|abstract|synchronized)\s+)*)((?!(?:else|new|return|throw|function|public|private|protected)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*([A-Za-z_$][\w$]*\b)\s*("B\d+")(\s*throws\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)*)?\s*("A\d+"|;)/g;var aM=/^((?:(?:public|private|final|protected|static)\s+)*)((?!(?:else|new|return|throw)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*([A-Za-z_$][\w$]*\b)\s*(?:"C\d+"\s*)*([=,]|$)/;var bm=/\b((?:(?:public|private|final|protected|static|abstract)\s+)*)((?!(?:new|return|throw)\b)[A-Za-z_$][\w$]*\b)\s*("B\d+")(\s*throws\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)*)?\s*("A\d+")/g;var W=/^((?:(?:public|private|final|protected|static)\s+)*)((?!(?:new|return|throw)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*/;var au=/\bfunction(?:\s+([A-Za-z_$][\w$]*))?\s*("B\d+")\s*("A\d+")/g;function ae(br){var bq=br;bq=bq.replace(O,function(bs){return bc(bs,"E")});bq=bq.replace(bb,function(bs){return bc(bs,"D")});bq=bq.replace(au,function(bs){return bc(bs,"H")});return bq}function bd(bs,br){var bq=bs.replace(bm,function(bx,bu,bv,by,bw,bt){if(bv!==br){return bx}return bc(bx,"G")});return bq}function aH(bq){this.name=bq}aH.prototype.toString=function(){return this.name};function ao(br,bq){this.params=br;this.methodArgsParam=bq}ao.prototype.getNames=function(){var bs=[];for(var br=0,bq=this.params.length;br<bq;++br){bs.push(this.params[br].name)}return bs};ao.prototype.prependMethodArgs=function(bq){if(!this.methodArgsParam){return bq}return"{\nvar "+this.methodArgsParam.name+" = Array.prototype.slice.call(arguments, "+this.params.length+");\n"+bq.substring(1)};ao.prototype.toString=function(){if(this.params.length===0){return"()"}var bq="(";for(var bs=0,br=this.params.length;bs<br;++bs){bq+=this.params[bs]+", "}return bq.substring(0,bq.length-2)+")"};function aD(bw){var bt=a6(bw.substring(1,bw.length-1));var bq=[],bu=null;if(bt!==""){var br=bt.split(",");for(var bs=0;bs<br.length;++bs){var bv=/\b([A-Za-z_$][\w$]*\b)(\s*"[ABC][\d]*")*\s*$/.exec(br[bs]);if(bs===br.length-1&&br[bs].indexOf("...")>=0){bu=new aH(bv[1]);break}bq.push(new aH(bv[1]))}}return new ao(bq,bu)}function aq(bu){var bt=bu;bt=bt.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\s*"C\d+")+\s*("A\d+")/g,function(bw,bv,bx){return bx});bt=bt.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\s*"B\d+")\s*("A\d+")/g,function(bw,bv,bx){return bc(bw,"F")});bt=bt.replace(au,function(bv){return bc(bv,"H")});bt=bt.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)\s*("C\d+"(?:\s*"C\d+")*)/g,function(bA,bz,bx){var bw=bx.replace(/"C(\d+)"/g,function(bC,bB){return bk[bB]}).replace(/\[\s*\]/g,"[null]").replace(/\s*\]\s*\[\s*/g,", ");var by="{"+bw.substring(1,bw.length-1)+"}";var bv="('"+bz+"', "+bc(by,"A")+")";return"$p.createJavaArray"+bc(bv,"B")});bt=bt.replace(/(\.\s*length)\s*"B\d+"/g,"$1");bt=bt.replace(/#([0-9A-Fa-f]{6})\b/g,function(bv,bw){return"0xFF"+bw});bt=bt.replace(/"B(\d+)"(\s*(?:[\w$']|"B))/g,function(by,bw,bx){var bz=bk[bw];if(!/^\(\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\s*(?:"C\d+"\s*)*\)$/.test(bz)){return by}if(/^\(\s*int\s*\)$/.test(bz)){return"(int)"+bx}var bv=bz.split(/"C(\d+)"/g);if(bv.length>1){if(!/^\[\s*\]$/.test(bk[bv[1]])){return by}}return""+bx});bt=bt.replace(/\(int\)([^,\]\)\}\?\:\*\+\-\/\^\|\%\&\~<\>\=]+)/g,function(bw,bv){var bx=aP(bv);return bx.untrim("__int_cast("+bx.middle+")")});bt=bt.replace(/\bsuper(\s*"B\d+")/g,"$$superCstr$1").replace(/\bsuper(\s*\.)/g,"$$super$1");bt=bt.replace(/\b0+((\d*)(?:\.[\d*])?(?:[eE][\-\+]?\d+)?[fF]?)\b/,function(bx,bw,bv){if(bw===bv){return bx}return bv===""?"0"+bw:bw});bt=bt.replace(/\b(\.?\d+\.?)[fF]\b/g,"$1");bt=bt.replace(/([^\s])%([^=\s])/g,"$1 % $2");bt=bt.replace(/\b(frameRate|keyPressed|mousePressed)\b(?!\s*"B)/g,"__$1");bt=bt.replace(/\b(boolean|byte|char|float|int)\s*"B/g,function(bw,bv){return"parse"+bv.substring(0,1).toUpperCase()+bv.substring(1)+'"B'});bt=bt.replace(/\bpixels\b\s*(("C(\d+)")|\.length)?(\s*=(?!=)([^,\]\)\}]+))?/g,function(bw,bA,bv,bz,by,bB){if(bv){var bx=bk[bz];if(by){return"pixels.setPixel"+bc("("+bx.substring(1,bx.length-1)+","+bB+")","B")}return"pixels.getPixel"+bc("("+bx.substring(1,bx.length-1)+")","B")}if(bA){return"pixels.getLength"+bc("()","B")}if(by){return"pixels.set"+bc("("+bB+")","B")}return"pixels.toArray"+bc("()","B")});var bs;function br(bw,bv,bA,by){var bx=bk[by];bs=true;var bz=aP(bx.substring(1,bx.length-1));return"__"+bA+(bz.middle===""?bc("("+bv.replace(/\.\s*$/,"")+")","B"):bc("("+bv.replace(/\.\s*$/,"")+","+bz.middle+")","B"))}do{bs=false;bt=bt.replace(/((?:'\d+'|\b[A-Za-z_$][\w$]*\s*(?:"[BC]\d+")*)\s*\.\s*(?:[A-Za-z_$][\w$]*\s*(?:"[BC]\d+"\s*)*\.\s*)*)(replace|replaceAll|replaceFirst|contains|equals|equalsIgnoreCase|hashCode|toCharArray|printStackTrace|split|startsWith|endsWith|codePointAt|matches)\s*"B(\d+)"/g,br)}while(bs);function bq(bx,bv,bw){bs=true;return"__instanceof"+bc("("+bv+", "+bw+")","B")}do{bs=false;bt=bt.replace(/((?:'\d+'|\b[A-Za-z_$][\w$]*\s*(?:"[BC]\d+")*)\s*(?:\.\s*[A-Za-z_$][\w$]*\s*(?:"[BC]\d+"\s*)*)*)instanceof\s+([A-Za-z_$][\w$]*\s*(?:\.\s*[A-Za-z_$][\w$]*)*)/g,bq)}while(bs);bt=bt.replace(/\bthis(\s*"B\d+")/g,"$$constr$1");return bt}function aC(br,bq){this.baseInterfaceName=br;this.body=bq;bq.owner=this}aC.prototype.toString=function(){return"new ("+this.body+")"};function ai(bs){var br=(new RegExp(/\bnew\s*([A-Za-z_$][\w$]*\s*(?:\.\s*[A-Za-z_$][\w$]*)*)\s*"B\d+"\s*"A(\d+)"/)).exec(bs);var bv=a9,bu=a7();a9=bu;var bq=br[1]+"$"+bu;var bt=new aC(bq,V(bk[br[2]],bq,"","implements "+br[1]));bl(bt,bu,bv);a9=bv;return bt}function af(br,bs,bq){this.name=br;this.params=bs;this.body=bq}af.prototype.toString=function(){var bs=al;var bt=av({"this":null},this.params.getNames());al=function(bu){return bt.hasOwnProperty(bu.name)?bu.name:bs(bu)};var br="function";if(this.name){br+=" "+this.name}var bq=this.params.prependMethodArgs(this.body.toString());br+=this.params+" "+bq;al=bs;return br};function aK(br){var bq=(new RegExp(/\b([A-Za-z_$][\w$]*)\s*"B(\d+)"\s*"A(\d+)"/)).exec(br);return new af(bq[1]!=="function"?bq[1]:null,aD(bk[bq[2]]),ap(bk[bq[3]]))}function ad(bq){this.members=bq}ad.prototype.toString=function(){var bs=al;al=function(bu){return bu.name==="this"?"this":bs(bu)};var bq="";for(var bt=0,br=this.members.length;bt<br;++bt){if(this.members[bt].label){bq+=this.members[bt].label+": "}bq+=this.members[bt].value.toString()+", "}al=bs;return bq.substring(0,bq.length-2)};function aF(bt){var bq=bt.split(",");for(var bs=0;bs<bq.length;++bs){var br=bq[bs].indexOf(":");if(br<0){bq[bs]={value:aZ(bq[bs])}}else{bq[bs]={label:a6(bq[bs].substring(0,br)),value:aZ(a6(bq[bs].substring(br+1)))}}}return new ad(bq)}function ay(bs){if(bs.charAt(0)==="("||bs.charAt(0)==="["){return bs.charAt(0)+ay(bs.substring(1,bs.length-1))+bs.charAt(bs.length-1)}if(bs.charAt(0)==="{"){if(/^\{\s*(?:[A-Za-z_$][\w$]*|'\d+')\s*:/.test(bs)){return"{"+bc(bs.substring(1,bs.length-1),"I")+"}"}return"["+ay(bs.substring(1,bs.length-1))+"]"}var br=aP(bs);var bq=aq(br.middle);bq=bq.replace(/"[ABC](\d+)"/g,function(bu,bt){return ay(bk[bt])});return br.untrim(bq)}function R(bq){return bq.replace(/(\.\s*)?((?:\b[A-Za-z_]|\$)[\w$]*)(\s*\.\s*([A-Za-z_$][\w$]*)(\s*\()?)?/g,function(bt,bv,br,bx,bw,bu){if(bv){return bt}var bs={name:br,member:bw,callSign:!!bu};return al(bs)+(bx===t?"":bx)})}function bp(br,bq){this.expr=br;this.transforms=bq}bp.prototype.toString=function(){var bq=this.transforms;var br=R(this.expr);return br.replace(/"!(\d+)"/g,function(bt,bs){return bq[bs].toString()})};aZ=function(bs){var br=[];var bq=ay(bs);bq=bq.replace(/"H(\d+)"/g,function(bu,bt){br.push(aK(bk[bt]));return'"!'+(br.length-1)+'"'});bq=bq.replace(/"F(\d+)"/g,function(bu,bt){br.push(ai(bk[bt]));return'"!'+(br.length-1)+'"'});bq=bq.replace(/"I(\d+)"/g,function(bu,bt){br.push(aF(bk[bt]));return'"!'+(br.length-1)+'"'});return new bp(bq,br)};function a4(bq,bs,br){this.name=bq;this.value=bs;this.isDefault=br}a4.prototype.toString=function(){return this.name+" = "+this.value};function ak(bu,br){var bv=bu.indexOf("=");var bq,bt,bs;if(bv<0){bq=bu;bt=br;bs=true}else{bq=bu.substring(0,bv);bt=aZ(bu.substring(bv+1));bs=false}return new a4(a6(bq.replace(/(\s*"C\d+")+/g,"")),bt,bs)}function aT(bq){if(bq==="int"||bq==="float"){return"0"}if(bq==="boolean"){return"false"}if(bq==="color"){return"0x00000000"}return"null"}function aI(br,bq){this.definitions=br;this.varType=bq}aI.prototype.getNames=function(){var bs=[];for(var br=0,bq=this.definitions.length;br<bq;++br){bs.push(this.definitions[br].name)}return bs};aI.prototype.toString=function(){return"var "+this.definitions.join(",")};function ah(bq){this.expression=bq}ah.prototype.toString=function(){return this.expression.toString()};function bn(bu){if(aM.test(bu)){var bt=W.exec(bu);var bs=bu.substring(bt[0].length).split(",");var bq=aT(bt[2]);for(var br=0;br<bs.length;++br){bs[br]=ak(bs[br],bq)}return new aI(bs,bt[2])}return new ah(aZ(bu))}function a1(bq,bs,br){this.initStatement=bq;this.condition=bs;this.step=br}a1.prototype.toString=function(){return"("+this.initStatement+"; "+this.condition+"; "+this.step+")"};function aS(br,bq){this.initStatement=br;this.container=bq}aS.prototype.toString=function(){var bq=this.initStatement.toString();if(bq.indexOf("=")>=0){bq=bq.substring(0,bq.indexOf("="))}return"("+bq+" in "+this.container+")"};function aY(br,bq){this.initStatement=br;this.container=bq}aY.iteratorId=0;aY.prototype.toString=function(){var bu=this.initStatement.toString();var br="$it"+aY.iteratorId++;var bt=bu.replace(/^\s*var\s*/,"").split("=")[0];var bs="var "+br+" = new $p.ObjectIterator("+this.container+"), "+bt+" = void(0)";var bq=br+".hasNext() && (("+bt+" = "+br+".next()) || true)";return"("+bs+"; "+bq+";)"};function Y(br){var bq;if(/\bin\b/.test(br)){bq=br.substring(1,br.length-1).split(/\bin\b/g);return new aS(bn(a6(bq[0])),aZ(bq[1]))}if(br.indexOf(":")>=0&&br.indexOf(";")<0){bq=br.substring(1,br.length-1).split(":");return new aY(bn(a6(bq[0])),aZ(bq[1]))}bq=br.substring(1,br.length-1).split(";");return new a1(bn(a6(bq[0])),aZ(bq[1]),aZ(bq[2]))}function a2(bq){bq.sort(function(bs,br){return br.weight-bs.weight})}function ab(bs,bq,br){this.name=bs;this.body=bq;this.isStatic=br;bq.owner=this}ab.prototype.toString=function(){return""+this.body};function an(bs,bq,br){this.name=bs;this.body=bq;this.isStatic=br;bq.owner=this}an.prototype.toString=function(){return""+this.body};function T(bs){var br=O.exec(bs);O.lastIndex=0;var bt=br[1].indexOf("static")>=0;var bq=bk[aQ(br[6])],bv;var bw=a9,bu=a7();a9=bu;if(br[2]==="interface"){bv=new ab(br[3],S(bq,br[3],br[4]),bt)}else{bv=new an(br[3],V(bq,br[3],br[4],br[5]),bt)}bl(bv,bu,bw);a9=bw;return bv}function ac(bs,bt,bq,br){this.name=bs;this.params=bt;this.body=bq;this.isStatic=br}ac.prototype.toString=function(){var bt=av({},this.params.getNames());var bs=al;al=function(bu){return bt.hasOwnProperty(bu.name)?bu.name:bs(bu)};var br=this.params.prependMethodArgs(this.body.toString());var bq="function "+this.methodId+this.params+" "+br+"\n";al=bs;return bq};function P(bt){var br=bb.exec(bt);bb.lastIndex=0;var bs=br[1].indexOf("static")>=0;var bq=br[6]!==";"?bk[aQ(br[6])]:"{}";return new ac(br[3],aD(bk[aQ(br[4])]),ap(bq),bs)}function am(bs,br,bq){this.definitions=bs;this.fieldType=br;this.isStatic=bq}am.prototype.getNames=function(){var bs=[];for(var br=0,bq=this.definitions.length;br<bq;++br){bs.push(this.definitions[br].name)}return bs};am.prototype.toString=function(){var bx=al({name:"[this]"});if(this.isStatic){var bw=this.owner.name;var bu=[];for(var bv=0,bt=this.definitions.length;bv<bt;++bv){var bs=this.definitions[bv];var bq=bs.name,by=bw+"."+bq;var br="if("+by+" === void(0)) {\n "+by+" = "+bs.value+"; }\n$p.defineProperty("+bx+", '"+bq+"', { get: function(){return "+by+";}, set: function(val){"+by+" = val;} });\n";bu.push(br)}return bu.join("")}return bx+"."+this.definitions.join("; "+bx+".")};function bf(bv){var bu=W.exec(bv);var bq=bu[1].indexOf("static")>=0;var bt=bv.substring(bu[0].length).split(/,\s*/g);var br=aT(bu[2]);for(var bs=0;bs<bt.length;++bs){bt[bs]=ak(bt[bs],br)}return new am(bt,bu[2],bq)}function aN(br,bq){this.params=br;this.body=bq}aN.prototype.toString=function(){var bt=av({},this.params.getNames());var br=al;al=function(bu){return bt.hasOwnProperty(bu.name)?bu.name:br(bu)};var bs="function $constr_"+this.params.params.length+this.params.toString();var bq=this.params.prependMethodArgs(this.body.toString());if(!/\$(superCstr|constr)\b/.test(bq)){bq="{\n$superCstr();\n"+bq.substring(1)}al=br;return bs+bq+"\n"};function at(bs){var bq=(new RegExp(/"B(\d+)"\s*"A(\d+)"/)).exec(bs);var br=aD(bk[bq[1]]);return new aN(br,ap(bk[bq[2]]))}function aO(bs,bv,bu,bq,bw,bx){var bt,br;this.name=bs;this.interfacesNames=bv;this.methodsNames=bu;this.fields=bq;this.innerClasses=bw;this.misc=bx;for(bt=0,br=bq.length;bt<br;++bt){bq[bt].owner=this}}aO.prototype.getMembers=function(bx,bq,bv){if(this.owner.base){this.owner.base.body.getMembers(bx,bq,bv)}var bu,bt,bs,br;for(bu=0,bs=this.fields.length;bu<bs;++bu){var bz=this.fields[bu].getNames();for(bt=0,br=bz.length;bt<br;++bt){bx[bz[bt]]=this.fields[bu]}}for(bu=0,bs=this.methodsNames.length;bu<bs;++bu){var bw=this.methodsNames[bu];bq[bw]=true}for(bu=0,bs=this.innerClasses.length;bu<bs;++bu){var by=this.innerClasses[bu];bv[by.name]=by}};aO.prototype.toString=function(){function br(bH){var bG=0;while(bH){++bG;bH=bH.scope}return bG}var bA=br(this.owner);var bB=this.name;var bx="";var bC="";var bE={},bz={},by={};this.getMembers(bE,bz,by);var bw,bu,bv,bt;if(this.owner.interfaces){var bq=[],bs;for(bw=0,bu=this.interfacesNames.length;bw<bu;++bw){if(!this.owner.interfaces[bw]){continue}bs=al({name:this.interfacesNames[bw]});bq.push(bs);bx+="$p.extendInterfaceMembers("+bB+", "+bs+");\n"}bC+=bB+".$interfaces = ["+bq.join(", ")+"];\n"}bC+=bB+".$isInterface = true;\n";bC+=bB+".$methods = ['"+this.methodsNames.join("', '")+"'];\n";a2(this.innerClasses);for(bw=0,bu=this.innerClasses.length;bw<bu;++bw){var bF=this.innerClasses[bw];if(bF.isStatic){bx+=bB+"."+bF.name+" = "+bF+";\n"}}for(bw=0,bu=this.fields.length;bw<bu;++bw){var bD=this.fields[bw];if(bD.isStatic){bx+=bB+"."+bD.definitions.join(";\n"+bB+".")+";\n"}}return"(function() {\nfunction "+bB+"() { throw 'Unable to create the interface'; }\n"+bx+bC+"return "+bB+";\n})()"};S=function(bw,br,bB){var bC=bw.substring(1,bw.length-1);bC=ae(bC);bC=bd(bC,br);var bz=[],bt=[];bC=bC.replace(/"([DE])(\d+)"/g,function(bF,bE,bD){if(bE==="D"){bz.push(bD)}else{if(bE==="E"){bt.push(bD)}}return""});var bx=bC.split(/;(?:\s*;)*/g);var bu;var bv,bs;if(bB!==t){bu=bB.replace(/^\s*extends\s+(.+?)\s*$/g,"$1").split(/\s*,\s*/g)}for(bv=0,bs=bz.length;bv<bs;++bv){var bq=P(bk[bz[bv]]);bz[bv]=bq.name}for(bv=0,bs=bx.length-1;bv<bs;++bv){var bA=aP(bx[bv]);bx[bv]=bf(bA.middle)}var by=bx.pop();for(bv=0,bs=bt.length;bv<bs;++bv){bt[bv]=T(bk[bt[bv]])}return new aO(br,bu,bz,bx,bt,{tail:by})};function aB(br,by,bx,bw,bs,bz,bA,bu,bq){var bv,bt;this.name=br;this.baseClassName=by;this.interfacesNames=bx;this.functions=bw;this.methods=bs;this.fields=bz;this.cstrs=bA;this.innerClasses=bu;this.misc=bq;for(bv=0,bt=bz.length;bv<bt;++bv){bz[bv].owner=this}}aB.prototype.getMembers=function(bx,br,bw){if(this.owner.base){this.owner.base.body.getMembers(bx,br,bw)}var bv,bu,bt,bs;for(bv=0,bt=this.fields.length;bv<bt;++bv){var bz=this.fields[bv].getNames();for(bu=0,bs=bz.length;bu<bs;++bu){bx[bz[bu]]=this.fields[bv]}}for(bv=0,bt=this.methods.length;bv<bt;++bv){var bq=this.methods[bv];br[bq.name]=bq}for(bv=0,bt=this.innerClasses.length;bv<bt;++bv){var by=this.innerClasses[bv];bw[by.name]=by}};aB.prototype.toString=function(){function bN(bV){var bU=0;while(bV){++bU;bV=bV.scope}return bU}var bB=bN(this.owner);var bG="$this_"+bB;var bs=this.name;var bx="var "+bG+" = this;\n";var bH="";var bz="";var bS={},bT={},bJ={};this.getMembers(bS,bT,bJ);var bR=al;al=function(bV){var bU=bV.name;if(bU==="this"){return bV.callSign||!bV.member?bG+".$self":bG}if(bS.hasOwnProperty(bU)){return bS[bU].isStatic?bs+"."+bU:bG+"."+bU}if(bJ.hasOwnProperty(bU)){return bG+"."+bU}if(bT.hasOwnProperty(bU)){return bT[bU].isStatic?bs+"."+bU:bG+".$self."+bU}return bR(bV)};var bA;if(this.baseClassName){bA=bR({name:this.baseClassName});bx+="var $super = { $upcast: "+bG+" };\n";bx+="function $superCstr(){"+bA+".apply($super,arguments);if(!('$self' in $super)) $p.extendClassChain($super)}\n";bz+=bs+".$base = "+bA+";\n"}else{bx+="function $superCstr(){$p.extendClassChain("+bG+")}\n"}if(this.owner.base){bH+="$p.extendStaticMembers("+bs+", "+bA+");\n"}var bM,bK,bL,bI;if(this.owner.interfaces){var bw=[],bq;for(bM=0,bK=this.interfacesNames.length;bM<bK;++bM){if(!this.owner.interfaces[bM]){continue}bq=bR({name:this.interfacesNames[bM]});bw.push(bq);bH+="$p.extendInterfaceMembers("+bs+", "+bq+");\n"}bz+=bs+".$interfaces = ["+bw.join(", ")+"];\n"}if(this.functions.length>0){bx+=this.functions.join("\n")+"\n"}a2(this.innerClasses);for(bM=0,bK=this.innerClasses.length;bM<bK;++bM){var bD=this.innerClasses[bM];if(bD.isStatic){bH+=bs+"."+bD.name+" = "+bD+";\n";bx+=bG+"."+bD.name+" = "+bs+"."+bD.name+";\n"}else{bx+=bG+"."+bD.name+" = "+bD+";\n"}}for(bM=0,bK=this.fields.length;bM<bK;++bM){var br=this.fields[bM];if(br.isStatic){bH+=bs+"."+br.definitions.join(";\n"+bs+".")+";\n";for(bL=0,bI=br.definitions.length;bL<bI;++bL){var bu=br.definitions[bL].name,by=bs+"."+bu;bx+="$p.defineProperty("+bG+", '"+bu+"', {get: function(){return "+by+"}, set: function(val){"+by+" = val}});\n"}}else{bx+=bG+"."+br.definitions.join(";\n"+bG+".")+";\n"}}var bC={};for(bM=0,bK=this.methods.length;bM<bK;++bM){var bt=this.methods[bM];var bP=bC[bt.name];var bv=bt.name+"$"+bt.params.params.length;var bF=!!bt.params.methodArgsParam;if(bP){++bP;bv+="_"+bP}else{bP=1}bt.methodId=bv;bC[bt.name]=bP;if(bt.isStatic){bH+=bt;bH+="$p.addMethod("+bs+", '"+bt.name+"', "+bv+", "+bF+");\n";bx+="$p.addMethod("+bG+", '"+bt.name+"', "+bv+", "+bF+");\n"}else{bx+=bt;bx+="$p.addMethod("+bG+", '"+bt.name+"', "+bv+", "+bF+");\n"}}bx+=a6(this.misc.tail);if(this.cstrs.length>0){bx+=this.cstrs.join("\n")+"\n"}bx+="function $constr() {\n";var bQ=[];for(bM=0,bK=this.cstrs.length;bM<bK;++bM){var bO=this.cstrs[bM].params.params.length;var bE=!!this.cstrs[bM].params.methodArgsParam;bQ.push("if(arguments.length "+(bE?">=":"===")+" "+bO+") { $constr_"+bO+".apply("+bG+", arguments); }")}if(bQ.length>0){bx+=bQ.join(" else ")+" else "}bx+="$superCstr();\n}\n";bx+="$constr.apply(null, arguments);\n";al=bR;return"(function() {\nfunction "+bs+"() {\n"+bx+"}\n"+bH+bz+"return "+bs+";\n})()"};V=function(bz,br,bq,bC){var bE=bz.substring(1,bz.length-1);bE=ae(bE);bE=bd(bE,br);var bs=[],bt=[],bD=[],bw=[];bE=bE.replace(/"([DEGH])(\d+)"/g,function(bH,bG,bF){if(bG==="D"){bs.push(bF)}else{if(bG==="E"){bt.push(bF)}else{if(bG==="H"){bw.push(bF)}else{bD.push(bF)}}}return""});var by=bE.replace(/^(?:\s*;)+/,"").split(/;(?:\s*;)*/g);var bx,bv;var bu;if(bq!==t){bx=bq.replace(/^\s*extends\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)\s*$/g,"$1")}if(bC!==t){bv=bC.replace(/^\s*implements\s+(.+?)\s*$/g,"$1").split(/\s*,\s*/g)}for(bu=0;bu<bw.length;++bu){bw[bu]=aK(bk[bw[bu]])}for(bu=0;bu<bs.length;++bu){bs[bu]=P(bk[bs[bu]])}for(bu=0;bu<by.length-1;++bu){var bB=aP(by[bu]);by[bu]=bf(bB.middle)}var bA=by.pop();for(bu=0;bu<bD.length;++bu){bD[bu]=at(bk[bD[bu]])}for(bu=0;bu<bt.length;++bu){bt[bu]=T(bk[bt[bu]])}return new aB(br,bx,bv,bw,bs,by,bD,bt,{tail:bA})};function aw(br,bq){this.name=br;this.body=bq;bq.owner=this}aw.prototype.toString=function(){return"var "+this.name+" = "+this.body+";\n$p."+this.name+" = "+this.name+";\n"};function a5(br,bq){this.name=br;this.body=bq;bq.owner=this}a5.prototype.toString=function(){return"var "+this.name+" = "+this.body+";\n$p."+this.name+" = "+this.name+";\n"};function bo(bs){var br=O.exec(bs);O.lastIndex=0;var bq=bk[aQ(br[6])];var bv=a9,bt=a7();a9=bt;var bu;if(br[2]==="interface"){bu=new aw(br[3],S(bq,br[3],br[4]))}else{bu=new a5(br[3],V(bq,br[3],br[4],br[5]))}bl(bu,bt,bv);a9=bv;return bu}function aR(br,bs,bq){this.name=br;this.params=bs;this.body=bq}aR.prototype.toString=function(){var bt=av({},this.params.getNames());var bs=al;al=function(bu){return bt.hasOwnProperty(bu.name)?bu.name:bs(bu)};var br=this.params.prependMethodArgs(this.body.toString());var bq="function "+this.name+this.params+" "+br+"\n$p."+this.name+" = "+this.name+";";al=bs;return bq};function aW(bs){var br=bb.exec(bs);var bq=bb.lastIndex=0;return new aR(br[3],aD(bk[aQ(br[4])]),ap(bk[aQ(br[6])]))}function ag(bq){var br=bq;br=br.replace(/\b(catch\s*"B\d+"\s*"A\d+")(\s*catch\s*"B\d+"\s*"A\d+")+/g,"$1");return br}function aU(bq,br){this.argument=bq;this.misc=br}aU.prototype.toString=function(){return this.misc.prefix+this.argument.toString()};function Q(bq,br){this.argument=bq;this.misc=br}Q.prototype.toString=function(){return this.misc.prefix+this.argument.toString()};function ax(bq,br,bs){this.name=bq;this.argument=br;this.misc=bs}ax.prototype.toString=function(){var bq=this.misc.prefix;if(this.argument!==t){bq+=this.argument.toString()}return bq};function aL(bq){this.expr=bq}aL.prototype.toString=function(){return"case "+this.expr+":"};function X(bq){this.label=bq}X.prototype.toString=function(){return this.label};aV=function(by,bz,bs){var bD=new RegExp(/\b(catch|for|if|switch|while|with)\s*"B(\d+)"|\b(do|else|finally|return|throw|try|break|continue)\b|("[ADEH](\d+)")|\b(case)\s+([^:]+):|\b([A-Za-z_$][\w$]*\s*:)|(;)/g);var bA=[];by=ag(by);var bx=0,bt,br;while((bt=bD.exec(by))!==null){if(bt[1]!==t){var bw=by.lastIndexOf('"B',bD.lastIndex);var bC=by.substring(bx,bw);if(bt[1]==="for"){bA.push(new aU(Y(bk[bt[2]]),{prefix:bC}))}else{if(bt[1]==="catch"){bA.push(new Q(aD(bk[bt[2]]),{prefix:bC}))}else{bA.push(new ax(bt[1],aZ(bk[bt[2]]),{prefix:bC}))}}}else{if(bt[3]!==t){bA.push(new ax(bt[3],t,{prefix:by.substring(bx,bD.lastIndex)}))}else{if(bt[4]!==t){br=by.substring(bx,bD.lastIndex-bt[4].length);if(a6(br).length!==0){continue}bA.push(br);var bu=bt[4].charAt(1),bq=bt[5];if(bu==="D"){bA.push(bz(bk[bq]))}else{if(bu==="E"){bA.push(bs(bk[bq]))}else{if(bu==="H"){bA.push(aK(bk[bq]))}else{bA.push(ap(bk[bq]))}}}}else{if(bt[6]!==t){bA.push(new aL(aZ(a6(bt[7]))))}else{if(bt[8]!==t){br=by.substring(bx,bD.lastIndex-bt[8].length);if(a6(br).length!==0){continue}bA.push(new X(by.substring(bx,bD.lastIndex)))}else{var bB=aP(by.substring(bx,bD.lastIndex-1));bA.push(bB.left);bA.push(bn(bB.middle));bA.push(bB.right+";")}}}}}bx=bD.lastIndex}var bv=aP(by.substring(bx));bA.push(bv.left);if(bv.middle!==""){bA.push(bn(bv.middle));bA.push(";"+bv.right)}return bA};function be(br){var bs=[];for(var bt=0,bq=br.length;bt<bq;++bt){var bu=br[bt];if(bu instanceof aI){bs=bs.concat(bu.getNames())}else{if(bu instanceof aU&&bu.argument.initStatement instanceof aI){bs=bs.concat(bu.argument.initStatement.getNames())}else{if(bu instanceof ab||bu instanceof an||bu instanceof aw||bu instanceof a5||bu instanceof aR||bu instanceof af){bs.push(bu.name)}}}}return av({},bs)}function U(bq){this.statements=bq}U.prototype.toString=function(){var bs=be(this.statements);var br=al;if(!ba(bs)){al=function(bt){return bs.hasOwnProperty(bt.name)?bt.name:br(bt)}}var bq="{\n"+this.statements.join("")+"\n}";al=br;return bq};ap=function(br){var bq=aP(br.substring(1,br.length-1));return new U(aV(bq.middle))};function aG(bq){this.statements=bq}aG.prototype.toString=function(){var bu=[],bv=[],bw;for(var bt=0,br=this.statements.length;bt<br;++bt){bw=this.statements[bt];if(bw instanceof a5||bw instanceof aw){bu.push(bw)}else{bv.push(bw)}}a2(bu);var bs=be(this.statements);al=function(by){var bx=by.name;if(bs.hasOwnProperty(bx)){return bx}if(aX.hasOwnProperty(bx)||B.hasOwnProperty(bx)||g.hasOwnProperty(bx)){return"$p."+bx}return bx};var bq="// this code was autogenerated from PJS\n(function($p) {\n"+bu.join("")+"\n"+bv.join("")+"\n})";al=null;return bq};bi=function(){var bq=ae(bk[0]);bq=bq.replace(/\bimport\s+[^;]+;/g,"");return new aG(aV(bq,aW,bo))};function bj(bq){var bu={};var bs,by;for(bs in aJ){if(aJ.hasOwnProperty(bs)){by=aJ[bs];var bE=by.scopeId,br=by.name;if(bE){var bD=aJ[bE];by.scope=bD;if(bD.inScope===t){bD.inScope={}}bD.inScope[br]=by}else{bu[br]=by}}}function bB(bF,bI){var bL=bI.split(".");var bH=bF.scope,bK;while(bH){if(bH.hasOwnProperty(bL[0])){bK=bH[bL[0]];break}bH=bH.scope}if(bK===t){bK=bu[bL[0]]}for(var bJ=1,bG=bL.length;bJ<bG&&bK;++bJ){bK=bK.inScope[bL[bJ]]}return bK}for(bs in aJ){if(aJ.hasOwnProperty(bs)){by=aJ[bs];var bx=by.body.baseClassName;if(bx){var bA=bB(by,bx);if(bA){by.base=bA;if(!bA.derived){bA.derived=[]}bA.derived.push(by)}}var bw=by.body.interfacesNames,bC=[],bv,bt;if(bw&&bw.length>0){for(bv=0,bt=bw.length;bv<bt;++bv){var bz=bB(by,bw[bv]);bC.push(bz);if(!bz){continue}if(!bz.derived){bz.derived=[]}bz.derived.push(by)}if(bC.length>0){by.interfaces=bC}}}}}function a8(bq){var bv=[],bs={};var br,by,bw;for(br in aJ){if(aJ.hasOwnProperty(br)){bw=aJ[br];if(!bw.inScope&&!bw.derived){bv.push(br);bw.weight=0}else{var bx=[];if(bw.inScope){for(by in bw.inScope){if(bw.inScope.hasOwnProperty(by)){bx.push(bw.inScope[by])}}}if(bw.derived){bx=bx.concat(bw.derived)}bs[br]=bx}}}function bz(bB,bD){var bA=bs[bB];if(!bA){return false}var bC=bA.indexOf(bD);if(bC<0){return false}bA.splice(bC,1);if(bA.length>0){return false}delete bs[bB];return true}while(bv.length>0){br=bv.shift();bw=aJ[br];if(bw.scopeId&&bz(bw.scopeId,bw)){bv.push(bw.scopeId);aJ[bw.scopeId].weight=bw.weight+1}if(bw.base&&bz(bw.base.classId,bw)){bv.push(bw.base.classId);bw.base.weight=bw.weight+1}if(bw.interfaces){var bu,bt;for(bu=0,bt=bw.interfaces.length;bu<bt;++bu){if(!bw.interfaces[bu]||!bz(bw.interfaces[bu].classId,bw)){continue}bv.push(bw.interfaces[bu].classId);bw.interfaces[bu].weight=bw.weight+1}}}}var bh=bi();bj(bh);a8(bh);var a0=bh.toString();a0=a0.replace(/\s*\n(?:[\t ]*\n)+/g,"\n\n");a0=a0.replace(/__x([0-9A-F]{4})/g,function(br,bq){return String.fromCharCode(parseInt(bq,16))});return aj(a0,N)}function z(O,ad){var X=(new RegExp(/\/\*\s*@pjs\s+((?:[^\*]|\*+[^\*\/])*)\*\//g)).exec(O);if(X&&X.length===2){var N=[],Q=X.splice(1,2)[0].replace(/\{([\s\S]*?)\}/g,function(){return function(ag,ah){N.push(ah);return"{"+(N.length-1)+"}"}}()).replace("\n","").replace("\r","").split(";");var W=function(ag){return ag.replace(/^\s*["']?/,"").replace(/["']?\s*$/,"")};for(var aa=0,Y=Q.length;aa<Y;aa++){var U=Q[aa].split("=");if(U&&U.length===2){var af=W(U[0]),V=W(U[1]),ae=[];if(af==="preload"){ae=V.split(",");for(var Z=0,ab=ae.length;Z<ab;Z++){var ac=W(ae[Z]);ad.imageCache.add(ac)}}else{if(af==="font"){ae=V.split(",");for(var R=0,T=ae.length;R<T;R++){var S=W(ae[R]),P=/^\{(\d*?)\}$/.exec(S);H.preloading.add(P?JSON.parse("{"+N[P[1]]+"}"):S)}}else{if(af==="pauseOnBlur"){ad.options.pauseOnBlur=V==="true"}else{if(af==="globalKeyEvents"){ad.options.globalKeyEvents=V==="true"}else{if(af.substring(0,6)==="param-"){ad.params[af.substring(6)]=V}else{ad.options[af]=V}}}}}}}}return O}F.compile=function(N){var Q=new F.Sketch;var O=z(N,Q);var P=c(O);Q.sourceCode=P;return Q};var j=function(){var T={},Q="undefined",R="function",N=!1,S=!0,O=512,P="log";if(typeof tinylog!==Q&&typeof tinylog[P]===R){T[P]=tinylog[P]}else{if(typeof d!==Q&&!d.fake){(function(){var ao=d,am="div",ac="style",ag="title",ab={zIndex:10000,position:"fixed",bottom:"0px",width:"100%",height:"15%",fontFamily:"sans-serif",color:"#ccc",backgroundColor:"black"},ae={position:"relative",fontFamily:"monospace",overflow:"auto",height:"100%",paddingTop:"5px"},ai={height:"5px",marginTop:"-5px",cursor:"n-resize",backgroundColor:"darkgrey"},an={position:"absolute",top:"5px",right:"20px",color:"#111",MozBorderRadius:"4px",webkitBorderRadius:"4px",borderRadius:"4px",cursor:"pointer",fontWeight:"normal",textAlign:"center",padding:"3px 5px",backgroundColor:"#333",fontSize:"12px"},Y={minHeight:"16px"},af={fontSize:"12px",margin:"0 8px 0 8px",maxWidth:"100%",whiteSpace:"pre-wrap",overflow:"auto"},ad=ao.defaultView,al=ao.documentElement,U=al[ac],W=function(){var aq=arguments.length,ap,at,ar;while(aq--){at=arguments[aq--];ap=arguments[aq][ac];for(ar in at){if(at.hasOwnProperty(ar)){ap[ar]=at[ar]}}}},aj=function(ar,aq,ap){if(ar.addEventListener){ar.addEventListener(aq,ap,N)}else{if(ar.attachEvent){ar.attachEvent("on"+aq,ap)}}return[ar,aq,ap]},V=function(ar,aq,ap){if(ar.removeEventListener){ar.removeEventListener(aq,ap,N)}else{if(ar.detachEvent){ar.detachEvent("on"+aq,ap)}}},aa=function(aq){var ap=aq.childNodes,ar=ap.length;while(ar--){aq.removeChild(ap.item(0))}},ak=function(aq,ap){return aq.appendChild(ap)},ah=function(ap){return ao.createElement(ap)},Z=function(ap){return ao.createTextNode(ap)},X=T[P]=function(aE){var aw,ax=U.paddingBottom,ar=ah(am),aB=ar[ac],aC=ak(ar,ah(am)),au=ak(ar,ah(am)),at=ak(ar,ah(am)),aD=N,av=N,aq=N,ay=0,ap=function(){U.paddingBottom=ar.clientHeight+"px"},aA=function(aF){var aG=ad.innerHeight,aH=aC.clientHeight;if(aF<0){aF=0}else{if(aF+aH>aG){aF=aG-aH}}aB.height=aF/aG*100+"%";ap()},az=[aj(ao,"mousemove",function(aF){if(aD){aA(ad.innerHeight-aF.clientY);au.scrollTop=aq}}),aj(ao,"mouseup",function(){if(aD){aD=aq=N}}),aj(aC,"dblclick",function(aF){aF.preventDefault();if(av){aA(av);av=N}else{av=ar.clientHeight;aB.height="0px"}}),aj(aC,"mousedown",function(aF){aF.preventDefault();aD=S;aq=au.scrollTop}),aj(aC,"contextmenu",function(){aD=N}),aj(at,"click",function(){aw()})];aw=function(){var aF=az.length;while(aF--){V.apply(T,az[aF])}al.removeChild(ar);U.paddingBottom=ax;aa(au);aa(ar);T[P]=X};W(ar,ab,au,ae,aC,ai,at,an);at[ag]="Close Log";ak(at,Z("\u2716"));aC[ag]="Double-click to toggle log minimization";al.insertBefore(ar,al.firstChild);T[P]=function(aH){if(ay===O){au.removeChild(au.firstChild)}else{ay++}var aG=ak(au,ah(am)),aF=ak(aG,ah(am));aG[ag]=(new Date).toLocaleTimeString();W(aG,Y,aF,af);ak(aF,Z(aH));au.scrollTop=au.scrollHeight};T[P](aE);ap()}})()}else{if(typeof print===R){T[P]=print}}}return T}();F.logger=j;F.version="1.4.1";F.lib={};F.registerLibrary=function(N,O){F.lib[N]=O;if(O.hasOwnProperty("init")){O.init(g)}};F.instances=k;F.getInstanceById=function(N){return k[J[N]]};F.Sketch=function(N){this.attachFunction=N;this.options={pauseOnBlur:false,globalKeyEvents:false};this.onLoad=G;this.onSetup=G;this.onPause=G;this.onLoop=G;this.onFrameStart=G;this.onFrameEnd=G;this.onExit=G;this.params={};this.imageCache={pending:0,images:{},operaCache:{},add:function(P,O){if(this.images[P]){return}if(!n){this.images[P]=null}if(!O){O=new Image;O.onload=function(R){return function(){R.pending--}}(this);this.pending++;O.src=P}this.images[P]=O;if(D.opera){var Q=d.createElement("div");Q.appendChild(O);Q.style.position="absolute";Q.style.opacity=0;Q.style.width="1px";Q.style.height="1px";if(!this.operaCache[P]){d.body.appendChild(Q);this.operaCache[P]=Q}}}};this.sourceCode=undefined;this.attach=function(P){if(typeof this.attachFunction==="function"){this.attachFunction(P)}else{if(this.sourceCode){var O=(new Function("return ("+this.sourceCode+");"))();O(P);this.attachFunction=O}else{throw"Unable to attach sketch to the processing instance"}}};this.toString=function(){var O;var P="((function(Sketch) {\n";P+="var sketch = new Sketch(\n"+this.sourceCode+");\n";for(O in this.options){if(this.options.hasOwnProperty(O)){var Q=this.options[O];P+="sketch.options."+O+" = "+(typeof Q==="string"?'"'+Q+'"':""+Q)+";\n"}}for(O in this.imageCache){if(this.options.hasOwnProperty(O)){P+='sketch.imageCache.add("'+O+'");\n'}}P+="return sketch;\n})(Processing.Sketch))";return P}};var v=function(Q,N){var O=[],U=[],V=N.length,S=0;function T(W,Y){var X=new XMLHttpRequest;X.onreadystatechange=function(){if(X.readyState===4){var Z;if(X.status!==200&&X.status!==0){Z="Invalid XHR status "+X.status}else{if(X.responseText===""){if("withCredentials" in new XMLHttpRequest&&(new XMLHttpRequest).withCredentials===false&&D.location.protocol==="file:"){Z="XMLHttpRequest failure, possibly due to a same-origin policy violation. You can try loading this page in another browser, or load it from http://localhost using a local webserver. See the Processing.js README for a more detailed explanation of this problem and solutions."}else{Z="File is empty."}}}Y(X.responseText,Z)}};X.open("GET",W,true);if(X.overrideMimeType){X.overrideMimeType("application/json")}X.setRequestHeader("If-Modified-Since","Fri, 01 Jan 1960 00:00:00 GMT");X.send(null)}function P(X,W){function Z(ac,aa){O[X]=ac;++S;if(aa){U.push(W+" ==> "+aa)}if(S===V){if(U.length===0){try{return new F(Q,O.join("\n"))}catch(ab){throw"Processing.js: Unable to execute pjs sketch: "+ab}}else{throw"Processing.js: Unable to load pjs sketch files: "+U.join("\n")}}}if(W.charAt(0)==="#"){var Y=d.getElementById(W.substring(1));if(Y){Z(Y.text||Y.textContent)}else{Z("","Unable to load pjs sketch: element with id '"+W.substring(1)+"' was not found")}return}T(W,Z)}for(var R=0;R<V;++R){P(R,N[R])}};var I=function(){d.removeEventListener("DOMContentLoaded",I,false);k=[];var O=d.getElementsByTagName("canvas"),U;for(var T=0,P=O.length;T<P;T++){var W=O[T].getAttribute("data-processing-sources");if(W===null){W=O[T].getAttribute("data-src");if(W===null){W=O[T].getAttribute("datasrc")}}if(W){U=W.split(/\s+/g);for(var S=0;S<U.length;){if(U[S]){S++}else{U.splice(S,1)}}v(O[T],U)}}var ac,aa,N,Z,ab=d.getElementsByTagName("script"),Q=[];for(ac=ab.length-1;ac>=0;ac--){Q.push(ab[ac])}for(ac=0,aa=Q.length;ac<aa;ac++){var Y=Q[ac];if(!Y.getAttribute){continue}var X=Y.getAttribute("type");if(X&&(X.toLowerCase()==="text/processing"||X.toLowerCase()==="application/processing")){var V=Y.getAttribute("data-processing-target");O=t;if(V){O=d.getElementById(V)}else{var R=Y.nextSibling;while(R&&R.nodeType!==1){R=R.nextSibling}if(R&&R.nodeName.toLowerCase()==="canvas"){O=R}}if(O){if(Y.getAttribute("src")){U=Y.getAttribute("src").split(/\s+/);v(O,U);continue}N=Y.textContent||Y.text;Z=new F(O,N)}}}};F.reload=function(){if(k.length>0){for(var N=k.length-1;N>=0;N--){if(k[N]){k[N].exit()}}}I()};F.loadSketchFromSources=v;F.disableInit=function(){if(n){d.removeEventListener("DOMContentLoaded",I,false)}};if(n){D.Processing=F;d.addEventListener("DOMContentLoaded",I,false)}else{this.Processing=F}})(window,window.document,Math);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/misc/blinky_squares.pjs	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,47 @@
+
+void setup() {
+	size( 510, 510 );
+	smooth();
+
+	background( 200 );
+}
+
+void draw() {
+	if ( mousePressed ) {
+		rects(1);
+	}
+	else {
+		rects(0);
+	}
+}
+
+void rects( int rand ) {
+	int cwidth = 50;
+	int cheight = 50;
+
+	int curwidth = cwidth-(cwidth/5);
+	int curheight = cheight-(cwidth/5);
+
+	noStroke();
+
+	for ( int y = cheight/5; y <= height; y += cheight ) {
+		for ( int x = cwidth/5; x <= width; x += cwidth ) {
+			if ( rand == 1 ) {
+				fill( random(180,220) );
+			} 
+			else {
+				fill( 210 );
+			}
+
+			if ( (mouseX > x) && (mouseX < x + curwidth) &&
+					(mouseY > y) && (mouseY < y + curheight) ) { 
+
+				// mouse is inside rectangle
+			}
+			else {
+				rect( x, y, curwidth, curheight );
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/window/about.html	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- $Id$ -->
+<html lang="en">
+	<head>
+		<title>About</title>
+		<link rel="stylesheet" type="text/css" href="app://css/main.css" />
+		<link rel="stylesheet" type="text/css" href="app://css/about.css" />
+		<script src="app://js/jquery-2.0.3.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/dascyllus.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/about.js" type="text/javascript" charset="utf-8"></script>
+	</head>
+	<body>
+		<div>
+			<p>
+				This is <span id="name">&nbsp;</span> v<span id="version">&nbsp;</span>.</p>
+			<p>
+				Built using libtide <span id="tide-version">&nbsp;</span>
+				<span id="platform">&nbsp;</span>/<span id="arch">&nbsp;</span>.
+			</p>
+
+			<p>
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+				Blah blah blah
+				blah blah blah.
+			</p>
+		</div>
+	</body>
+</html>
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/window/main.html	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<!-- $Id$ -->
+<html lang="en">
+	<head>
+		<title>Dascyllus</title>
+		<meta charset="utf-8" />
+
+		<meta name="author" content="Mahlon E. Smith" />
+		<meta http-equiv="copyright" content="2013 Mahlon E. Smith" />
+		<meta http-equiv="content-language" content="en-US" />
+		<!-- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/> -->
+
+		<link rel="stylesheet" type="text/css" href="app://css/main.css" />
+		<script src="app://js/jquery-2.0.3.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/can.jquery-1.1.6.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/flot-0.8.1.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/flot-0.8.1-time.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/processing-1.4.1.min.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/dascyllus.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/main.js" type="text/javascript" charset="utf-8"></script>
+	</head>
+	<body>
+		<h1>HUH.</h1>
+		<p>That's right!</p>
+
+		<canvas data-processing-sources="app://misc/blinky_squares.pjs"></canvas>  
+	</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/window/prefs.html	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<!-- $Id$ -->
+<html lang="en">
+	<head>
+		<title>Preferences</title>
+		<meta charset="utf-8" />
+		<link rel="stylesheet" type="text/css" href="app://css/main.css" />
+		<link rel="stylesheet" type="text/css" href="app://css/prefs.css" />
+		<script src="app://js/jquery-2.0.3.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/can.jquery-1.1.6.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/dascyllus.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/prefs.js" type="text/javascript" charset="utf-8"></script>
+	</head>
+	<body>
+
+		<ul id="sections">
+			<li><a href="#app" class="icon" title="Application Behaviors">&#xf04e;</a></li>
+			<li><a href="#server" class="icon" title="Thingfish Server Config">&#xf0d7;</a></li>
+		</ul>
+
+		<div id="content">&nbsp;</div>
+	</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/window/prefs/app.ejs	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,16 @@
+<%# vim: set nosta noet ts=4 sw=4 ft=html: %>
+
+<fieldset>
+	<legend>Application Behavior</legend>
+	<table cellpadding="0" cellspacing="0">
+		<tbody>
+			<% $.each( bool_prefs, function( pref, vals ) {  %>
+			<tr>
+				<td class="desc"><label for="<%= pref %>_id"><%= vals[ 1 ] %><span></span></label></td>
+				<td><input id="<%= pref %>_id" type="checkbox" <%= vals[0] ? 'checked' : '' %> data-field="<%= pref %>" /></td>
+			</tr>
+			<% }) %>
+		</tbody>
+	</table>
+</fieldset>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/window/prefs/servers.ejs	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,12 @@
+<%# vim: set nosta noet ts=4 sw=4 ft=html: %>
+
+<fieldset>
+	<legend>Thingfish Server</legend>
+	<div>
+		<input id="server" type="text" placeholder="(thingfish server uri)" data-field="server"
+			value="<%= server %>" autocomplete="off" />
+
+		<input id="test" class="button" type="submit" data-field="test" value="Test" />
+	</div>
+</fieldset>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/window/splash.html	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<!-- $Id$ -->
+<html lang="en">
+	<head>
+		<title>Dascyllus</title>
+		<link rel="stylesheet" type="text/css" href="app://css/main.css" />
+		<link rel="stylesheet" type="text/css" href="app://css/splash.css" />
+		<script src="app://js/jquery-2.0.3.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/dascyllus.js" type="text/javascript" charset="utf-8"></script>
+		<script src="app://js/d/splash.js" type="text/javascript" charset="utf-8"></script>
+	</head>
+	<body>
+		<div>
+			<span id="name">&nbsp;</span>
+		</div>
+	</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/manifest	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,20 @@
+#appname:Dascyllus
+#appid:nu.martini.dascyllus
+#publisher:Mahlon E. Smith <mahlon@martini.nu>
+#image:icon.png
+#url:http//projects.martini.nu/dascyllus
+#guid:3f5509eb-3861-41da-a715-4a0d6d3739fc
+#desc:A client for the Thingfish network media store.
+#type:desktop
+runtime:1.3.1-beta
+app:1.3.1-beta
+codec:1.3.1-beta
+database:1.3.1-beta
+filesystem:1.3.1-beta
+media:1.3.1-beta
+monkey:1.3.1-beta
+network:1.3.1-beta
+platform:1.3.1-beta
+process:1.3.1-beta
+ui:1.3.1-beta
+worker:1.3.1-beta
Binary file misc/batch_webfont_reference.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/1.sql	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,2 @@
+CREATE TABLE IF NOT EXISTS prefs ( key TEXT PRIMARY KEY, val TEXT );
+CREATE INDEX IF NOT EXISTS key_idx ON prefs (key);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tiapp.xml	Mon Sep 02 02:22:21 2013 -0700
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- tidebuilder.py -d ~/Desktop/ -n . -->
+<ti:app xmlns:ti='http://ti.appcelerator.org'>
+	<id>nu.martini.dascyllus</id>
+	<name>Dascyllus</name>
+	<version>0.0.1</version>
+	<publisher>Mahlon E. Smith</publisher>
+	<url>http//projects.martini.nu/dascyllus/</url>
+	<icon>img/icon.png</icon>
+	<copyright>2013 Mahlon E. Smith</copyright>
+	<analytics>false</analytics>
+
+	<window>
+		<id>main</id>
+		<title>Dascyllus</title>
+		<url>app://window/main.html</url>
+		<width>800</width>
+		<min-width>0</min-width>
+		<height>450</height>
+		<min-height>0</min-height>
+		<fullscreen>false</fullscreen>
+		<resizable>true</resizable>
+		<chrome scrollbars="true">true</chrome>
+		<maximizable>true</maximizable>
+		<minimizable>true</minimizable>
+		<closeable>true</closeable>
+	</window>
+
+	<window>
+		<id>splash</id>
+		<title>Dascyllus</title>
+		<url>app://window/splash.html</url>
+		<width>800</width>
+		<height>450</height>
+		<fullscreen>false</fullscreen>
+		<resizable>false</resizable>
+		<chrome scrollbars="false">false</chrome>
+		<maximizable>false</maximizable>
+		<minimizable>false</minimizable>
+		<closeable>false</closeable>
+	</window>
+
+	<window>
+		<id>about</id>
+		<title>Dascyllus</title>
+		<url>app://window/about.html</url>
+		<width>600</width>
+		<height>432</height>
+		<fullscreen>false</fullscreen>
+		<resizable>false</resizable>
+		<chrome scrollbars="false">false</chrome>
+		<maximizable>false</maximizable>
+		<minimizable>false</minimizable>
+		<closeable>false</closeable>
+		<transparent-background>true</transparent-background>
+	</window>
+
+	<window>
+		<id>prefs</id>
+		<title>Preferences</title>
+		<url-regex>app://window/prefs\...*</url-regex>
+		<width>500</width>
+		<height>500</height>
+		<fullscreen>false</fullscreen>
+		<resizable>false</resizable>
+		<chrome scrollbars="true">true</chrome>
+		<maximizable>false</maximizable>
+		<minimizable>false</minimizable>
+		<closeable>true</closeable>
+	</window>
+</ti:app>
+